Floats und Doubles sind begrenzt. Sie sind nur in der Lage, gebrochene Anteile von Zahlen als eine Summe von zwei Basisfraktionen genau darzustellen. Der Bruchteil kann vollständig als die Summe einiger Serien wie dargestellt werden:
1/2 + 0/4 + 1/8 + 1/16 + ...
Leider gibt es eine große Anzahl von häufig gebrauchte Zahlen, die nie vollständig dargestellt werden, wie:
1/3, 1/7, 1/9, 5/11 usw.
Sie müssen prüfen, ob die Zahl genau, bevor Sie zu kümmern dargestellt werden Rundung. Wenn diese Art von Genauigkeit von äußerster Wichtigkeit ist, dann müssen Sie auf eine Nicht-Float- oder Nicht-Double-Lösung schauen.
Es gibt binäre Dezimalbibliotheken, die solche Berechnungen genau durchführen. Sie neigen dazu, langsamer zu berechnen, da es keine spezialisierte Hardware gibt, um ihre Berechnungen zu beschleunigen. Außerdem nehmen sie mehr Speicher in Anspruch, weil Sie im Wesentlichen eine Ziffernliste speichern.
Nachdem Sie die gewünschte Nummer für das Detail darstellen können, ist eine Rundungslösung einfach. Wahrscheinlich brauchen Sie nicht einmal eine Rundungslösung. weil der Hauptgrund, warum Sie versuchen, in diesem Fall zu runden, der Float ist, der Ihren Wert nicht richtig darstellen kann.
brach ich die einzige Zeile in mehrere Zeilen und lief er durch den Debugger. Das Problem scheint in der Analyse zu liegen. Es scheint, dass Float.parseFloat auf "32000.0" gerundet wird. – Shane
@Shane: Sie gehen immer noch davon aus, dass der Debugger Ihnen den genauen Wert zeigt, vermute ich. –
Wechsel zu BigDecimal behoben meine Probleme mit Dezimalstellen – jeff