Overblog
Edit post Folge diesem Blog Administration + Create my blog
Blog von Olaf Helper

VB(.NET) und das kaufmännische Runden

29. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Das "Problem" gibt es wohl seit Urzeit in VB und in VB.NET ist es immer noch drin: VB kann nicht kaufmänisch runden. Beispiel:

 Module MainModul 
  Sub Main() 
  'Runden mit Double 
  Debug.Print(System.Math.Round(1.5D, 0).ToString) ' = 2 (korrekt) 
  Debug.Print(System.Math.Round(2.5D, 0).ToString) ' = 2 (falsch) 
  Debug.Print(System.Math.Round(3.5D, 0).ToString) ' = 4 (korrekt) 
  Debug.Print(System.Math.Round(4.5D, 0).ToString) ' = 4 (falsch) 
  'Runden mit Decimal; auch nicht besser 
  Debug.Print(Decimal.Round(Convert.ToDecimal(1.5D), 0).ToString) ' = 2 (korrekt) 
  Debug.Print(Decimal.Round(Convert.ToDecimal(2.5d), 0).ToString) ' = 2 (falsch) 
   End Sub 
 End Module 

 

Der Grund ist einfach, das die Funktion "mathematisch" rundet und eben nicht "kaufmännisch". Und ärgerlich ist es schon, dass man das immer im Hinterkopf behalten muss; ich kenne kein Anwendungsgebiet, wo das so gewünscht ist. 

Workaround ist eine eigene Funktion zum Runden: 

  Public Function myRound(ByVal d As Decimal, ByVal decimals As Integer) As Decimal 
  'Kaufmännisch korrekt runden 
  Dim power As Long 
   
  power = 10 ^ decimals 
  myRound = (d * power + 0.5 * System.Math.Sign(d)) / power 
  End Function 

 

Test: 

  Debug.Print(myRound(1.5D, 0).ToString) ' = 2 
  Debug.Print(myRound(2.5D, 0).ToString) ' = 3 
  Debug.Print(myRound(3.5D, 0).ToString) ' = 4 
  Debug.Print(myRound(-1.5D, 0).ToString) ' = -2 

 

Klappt!

Diesen Post teilen
Repost0
Um über die neuesten Artikel informiert zu werden, abonnieren:
Kommentiere diesen Post