C # banker Rundungsfehler

8
%Vor%

.. gibt 18.57 zurück.
Für jede andere Zahl, die ich versuchte, funktionierte die Rundung der Bank wie erwartet, zum Beispiel Math.Round (2.565,2) ergab 2.56.

Irgendeine Ahnung, warum und wann das passiert? Ist es ein Fehler oder fehlt mir etwas über die Rundung des Bankiers?

Danke ..

    
Damir 23.09.2010, 06:07
quelle

4 Antworten

16
Wie Matthew sagte, kann 18.565 nicht genau dargestellt werden. Der tatsächlich verwendete Wert ist 18.56500000000000121278976924368180334568023681640625 (gefunden mit DoubleConverter ), was deutlich über die Hälfte hinausgeht. Jetzt habe ich ein schleichendes Gefühl, dass manchmal Math.Round einen Wert berücksichtigt, der tatsächlich hinter dem halben Weg liegt, aber der halb so nahe ist Punkt, wie genau dargestellt werden kann, da genau bei dieser Punkt ist. Ich habe jedoch keine Dokumentation gesehen, die die Situationen beschreibt, in denen dies angewendet wird, und es ist klar, dass dies in diesem Fall nicht geschieht. Ich würde mich nicht darauf verlassen wollen.

Selbst der gerundete Wert ist natürlich nicht exakt 18.57. Es ist eigentlich 18.57000000000000028421709430404007434844970703125.

Wenn Sie wirklich wirklich Wert darauf legen, Dezimalwerte genau darzustellen, sollten Sie decimal verwenden. Das ist nicht nur in Math.Round - es geht um jeden Aspekt der Handhabung von Gleitkommawerten.

Das macht natürlich den richtigen Wert für Math.Round :

%Vor%     
Jon Skeet 23.09.2010, 06:13
quelle
5

18.565 kann nicht genau als Doppel dargestellt werden. Die binäre Darstellung ist also etwas höher, also rundet sie sich ab. Wenn Sie Dezimal verwenden:

%Vor%

es kann genau dargestellt werden, und Sie werden dieses Problem nicht haben.

    
Matthew Flaschen 23.09.2010 06:11
quelle
1

Meine Vermutung ist, dass die FP-Darstellung bedeutet, dass es nicht wirklich eine 5 ist; die Gefahren von FP!

Das funktioniert aber gut:

%Vor%     
Marc Gravell 23.09.2010 06:13
quelle
0

Double ist ein Fließkommawert, also wenn Sie es als 18.565 schreiben, ist es tatsächlich im Speicher so etwas wie 18.5650000000000000000000000000000000001 und daher ist es mehr als der Mittelpunkt.

    
naivists 23.09.2010 06:14
quelle

Tags und Links