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!
Werbung
Diesen Post teilen
Um über die neuesten Artikel informiert zu werden, abonnieren:
Kommentiere diesen Post