BigDecimal Boden Rundung schief geht
Ich habe vor kurzem eine Frage über komische java-doppelter Boden Runden, und bekam Antworten zu verwenden BigDecimals statt, so versuchte Sie den folgenden code:
BigDecimal velocity = new BigDecimal(-0.07);
BigDecimal afterMultiplyingBy200 = velocity.multiply( new BigDecimal(200.0) );
BigDecimal floored = afterMultiplyingBy200.setScale(0, RoundingMode.FLOOR);
System.out.println("After multiplication " + afterMultiplyingBy200);
System.out.println("floored value is " + floored);
Und ich bekomme folgende Ergebnisse
After multiplication -14.000000000000001332267629550187848508358001708984375000
floored value is -15
Es scheint, dass sogar die Verwendung von BigDecimal-ich kann nicht richtigen Wert für die Multiplikation -0.07 200, gibt es irgendetwas was ich tun kann, um genau -14.0?
- Wenn Sie die Frage von einer Rundung Frage zu einer Vervielfachung Frage, warum die Erhaltung der falsche Titel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus meiner Antwort auf diese Frage:
Das problem ist, dass
new BigDecimal(-0.07);
verwendet einedouble
literal zur Initialisierung derBigDecimal
- also der Fehler passiert immer noch. Verwenden Sie dieBigDecimal
Konstruktor, eineString
statt.Das problem ist hier richtig:
-0.07
können nicht exakt dargestellt werden alsdouble
, so dass der Literale Wert, der an dieBigDecimal
Konstruktor endet als etwas anders als-0.07
.BigDecimal
dauert halt, dass ungefährer Wert und läuft mit ihm, produzieren die Ergebnisse, die Sie sehen.Versuchen:
Sollten Sie die string-Konstruktor zur Vermeidung von Rundungsfehlern durch die Verwendung von Doppel:
Javadoc-Extrakt für die Konstruktor mit Doppel - Hervorhebung von mir:
Sollten Sie einen Blick auf RoundingMode, vor allem
HALF_UP
.Laut die Dokumentation,
ROUND_FLOOR
rundet in Richtung negativ unendlich, so ist die Rundung-14.000...
zu-15
.