.. 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 ..
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
:
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.
Meine Vermutung ist, dass die FP-Darstellung bedeutet, dass es nicht wirklich eine 5 ist; die Gefahren von FP!
Das funktioniert aber gut:
%Vor%Tags und Links c# rounding bankers-rounding