Das Problem wird sein, dass Sie 0.575 nicht genau als binäre Fließkommazahl (zB ein Doppel) darstellen können. Obwohl ich nicht genau weiß, scheint es, dass die Darstellung am nächsten ist wahrscheinlich nur ein bisschen niedriger und so beim Runden verwendet es die wahre Darstellung und rundet ab.
Wenn Sie dieses Problem vermeiden möchten, verwenden Sie einen geeigneteren Datentyp. decimal
wird tun, was Sie wollen:
Math.Round(0.575M, 2, MidpointRounding.AwayFromZero)
Ergebnis: 0.58
Der Grund, dass 0,75 tut das Richtige ist, dass es einfach in binären Gleitkomma darstellen, da es einfach ist, 1/2 + 1/4 (dh 2^-1 + 2^-2). Im Allgemeinen kann jede endliche Summe von Zweierpotenzen im binären Fließkomma dargestellt werden. Ausnahmen sind, wenn Ihre Potenzen von 2 einen zu großen Bereich überspannen (zB 2^100 + 2 ist nicht genau darstellbar).
bearbeiten hinzuzufügen:
Formatting doubles for output in C# in Bezug auf Interesse sein könnte, warum die so schwer zu verstehen, zu verstehen, dass 0.575 nicht wirklich 0.575 ist. Der DoubleConverter in der angenommenen Antwort zeigt, dass 0,575 als eine exakte Zeichenkette 0.5749999999999999555910790149937383830547332763671875
ist. Sie können daraus sehen, warum das Runden 0,57 ergibt.
Die [erste Antwort in dieser Frage] (http://stackoverflow.com/q/5641616/62576) sollte helfen, diese zu beantworten. –
@KenWhite: Ich bin mir nicht sicher, ob es wird. Das Problem ist, dass bei richtiger Mathematik das Runden von '.575' auf zwei Dezimalstellen weg von Null' .58' ergibt, aber dies ist nicht das beobachtete Ergebnis. In diesem Fall handelt es sich um Floating Poitn-Darstellungen. – Chris
@Chris: Du hast Recht. :-) Ich benutze hauptsächlich Delphi, und Round() behandelt Dinge wie diese in den meisten Fällen gut. Ich habe gerade C# eingecheckt und kann das Problem sehen. –