VB(.NET) und das kaufmännische Runden
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
Um über die neuesten Artikel informiert zu werden, abonnieren:
Kommentiere diesen Post