Frage

double a = 18.565
return Math.Round(a,2)

.. kehrt 18.57.
Für jede andere Zahl, die ich Bank versuchten Rundung arbeitet wie erwartet, zum Beispiel Math.Round (2.565,2) ergab 2.56.

Jede Ahnung, warum und wann das passiert? Ist es Fehler oder bin ich etwas fehlt über bankübliche Rundung?

Danke ..

War es hilfreich?

Lösung

, sagte Wie Matthew, 18,565 nicht genau dargestellt werden. Der verwendete Istwert 18.565000000000001278976924368180334568023681640625 (gefunden mit DoubleConverter ), die deutlich über die Hälfte ist -Weg. Jetzt habe ich ein schleichendes Gefühl, dass manchmal Math.Round Wert prüfen wird, was wirklich über die halbe Strecke, die aber so nah an den auf halben Weg Punkt ist, wie werden kann, genau dargestellt, wie genau zu sein in diesem Punkt. Allerdings habe ich keine Unterlagen gesehen, die Situationen zu beschreiben, in denen das ist angelegt und klar ist es in diesem Fall nicht passiert. Ich möchte nicht auf sie verlassen können.

Auch der gerundete Wert ist nicht genau 18.57 natürlich. Es ist eigentlich 18,57000000000000028421709430404007434844970703125.

Im Grunde, wenn Sie wirklich, wirklich über Dezimalzahl repräsentiert Werte genau, sollten Sie die Verwendung decimal sein. Das ist nicht nur in Bezug auf Math.Round -. Es auf jeden Aspekt geht der Umgang mit Gleitkommazahlen

Das hat gibt den richtigen Wert für Math.Round, natürlich:

decimal m = 18.565m;
Console.WriteLine(Math.Round(m, 2)); // Prints 18.56

Andere Tipps

18,565 kann nicht genau als doppelt dargestellt werden. Somit wird die binäre Darstellung etwas höher, so rundet es auf. Wenn Sie dezimal verwenden:

decimal a = 18.565m;
return Math.Round(a,2)

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

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

Das funktioniert gut, aber:

        decimal a = 18.565M; // <===== decimal
        var s = Math.Round(a, 2);

Double ist ein Gleitkommawert, so vielleicht, wenn Sie es als 18,565 schreiben, es ist wie 18,56500000000000000000000000000000001 tatsächlich im Speicher etwas ist, und daher ist es mehr als der Mittelpunkt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top