2013-12-16 10 views
6

Warum wird Math.Round (0,125, 2) auf 0,12 gerundet?VB.Net Warum macht Math.Round 5 auf die nächste gerade Zahl, und was kann ich dagegen tun?

Dim foo As Decimal 
foo = Math.Round(0.125, 2) 

foo ist jetzt 0,12, aber es sollte b 0,13

ich es gehört, weil einige Standard in .Net rundet auf die nächste gerade Zahl, aber das ist nur schlecht math. 12.5 wird auf 12 Runden abgerundet, aber 13.5 Runden werden auf 14 Runden aufgeteilt. Gibt es einen Weg dies zu beheben?

+1

FYI, dies ist bekannt als „bankübliche Rundung“. –

+2

Es ist Banker Rundung. Verwenden Sie die Überladung Round(), die ein MidpointRounding-Argument verwendet, um es zu ändern. –

+3

http://stackoverflow.com/questions/311696/why-does-net-use-bankers-rounding-as-default – Will

Antwort

10

Vom documentation auf der Math.Round(decimal) Methode:

Wenn die Bruchkomponente von d auf halbem Weg zwischen zwei ganzen Zahlen ist, von denen eine gerade und die andere ungerade ist, wird die gerade Zahl zurückgegeben.

Die gleiche Logik gilt für die Math.Round(decimal, int) Überlastung. Hinweis:

Math.Round(0.125, 2) // 0.12 
Math.Round(0.135, 2) // 0.14 
Math.Round(0.145, 2) // 0.14 

Es ist nicht "schlechte Mathematik"; es ist eine übliche Rundungsstrategie, die als "rund-zu-gleichmäßig" bezeichnet wird. Von Wikipedia:

Diese Variante der Runde auf den nächstliegenden ist Methode auch vorbelastete Rundung genannt, konvergenten Runden, Statistiker Runden, Dutch Rundung Rundungs ​​Gaussian, ungerader sogar Rundung, Banker Rundung oder broken Rundung, und ist weit verbreitet in der Buchhaltung verwendet.

Dies ist der Standardrundungsmodus, der in IEEE 754-Berechnungsfunktionen und -operatoren verwendet wird.

Wenn Sie eine feinere Kontrolle über wollen, wie es rundet, können Sie einen MidpointRounding Parameter angeben

Math.Round(0.125, 2, MidpointRounding.AwayFromZero) // 0.13 
+0

Ah, MidpointRounding.AwayFromZero macht den Trick. Ich lerne jeden Tag etwas Neues. Vielen Dank! – BClaydon

Verwandte Themen