2016-10-17 2 views
-2

Ich muss einige Feinheit der .NET-Rundung fehlen. Also schaue ich mir dieses Beispiel an:Warum ist die Dezimalstelle 2.5M um 2?

decimal num = 2.5M; 
var result = Math.Round(num); 

Warum ist result = 2? (Ich würde 3 zu erwarten, da es aufrunden sollte)

+2

Sehr ähnlich klassische Rundung verwenden möchten: http://stackoverflow.com/questions/977796/why-does-math-round2-5- return-2-statt-of-3 – pmcoltrane

+0

ah ja, du hast Recht, ich habe diese Frage nicht gesehen. Danke, dass du es aufgezeigt hast. – Denis

Antwort

7

Siehe MSDN:

Dezimal Math.Round (Decimald)

Runden ein Dezimalwert auf die nächste ganze Zahl, und Runden midpoint Werte zur nächsten geraden Zahl (Beispiel).

"Mittelpunkt" bedeutet hier .5; die gerade Zahl in Ihrem Fall ist 2. Wenn Sie auf diese Weise 3.5 gerundet haben, würde dies 4 ergeben.

Wenn Sie stattdessen Rundung „von Null weg“ verwenden, können Sie the System.MidpointRounding.AwayFromZero enum verwenden:

decimal d = 2.5M; 
decimal roundedD = Math.Round(d, MidpointRounding.AwayFromZero); // results in 3 

In Bezug auf, warum es Mittelpunkt Rundung verwendet standardmäßig anstelle von „weg von Null (AKA„bankübliche Rundung“) "Rundung, see this answer. Angeblich ist es ein besserer Algorithmus (d. H. Über viele Iterationen hinweg effizienter).

+2

Warum sollten sie es so machen? Das klingt widersprüchlich, wie mir all diese Jahre die Rundung gelehrt wurde. – Denis

+0

also würde 4,5 auf 4 runden? – Denis

+3

@Denis Dies ist bekannt als "Banker Rundung". .5 liegt genau zwischen den beiden ganzen Zahlen, so dass Ihre Ergebnisse immer höher sind als die Realität. – GalacticCowboy

Verwandte Themen