JAVA auf zwei Nachkomma stellen runden in der GUI,aber nur wie?

...komplette Frage anzeigen

1 Antwort

Bei Geldbeträgen sollte man grundsätzlich nicht mit Gleitkommazahlen (double und float) rechnen, weil diese intern eine (halb-)logarithmische Darstellung verwenden, die auch bei vermeintlich "glatten" Zahlen zu (wenn auch geringen) Fehlern führt.

Beispielsweise lässt sich schon 0.1 nicht exakt darstellen, da ld(0.1) = -3.32192809488736234787031942948939017586483139302458...

(Es ist eine irrationale, in diesem Fall sogar eine transzendente Zahl.)

Besser den Betrag in Cent als Integer angeben.

Zu Deiner Frage:

Math.round rundet immer auf den Vorkommaanteil, also.

mRabatt = Math.round(mRabatt * 100.0) / 100.0

Würde dem, was Du willst, am nächsten kommen.

Besser ist es allerdings, nicht die Gleitkommadarstellung zu runden (spätestens wenn sie in einer float oder double Variablen gespeichert wird, wird sie ohnehin durch die (halb-)logarithmische interne Darstellung wieder "krumm" und unexakt), sondern nur auf eine gewisse Anzahl signifikanter Stellen auszugeben.

String sRabatt = String.format(null, "%.2f");
SuperDomatic 13.12.2015, 15:21

Krass..

Wusste nicht das,dass so komplizert werden könnte.

Aber vielen Dank! Werde das mal umsetzten

1
Omnivore08 13.12.2015, 15:30

Beispielsweise lässt sich schon 0.1 nicht exakt darstellen, da ld(0.1) = -3.32192809488736234787031942948939017586483139302458...

Ob das die richtige Erklärung ist?!

ld(0,75) ist -0,41503749927884381854626105605218...

Und eine 0,75 lässt sich ohne Probleme darstellen. Da ist nämlich in der Mantisse das erste Bit auf 1 (0,5). Exponet bei 2^-1. Also anhand des Logarithmus Dualis liegt das nicht. Sondern eher an der Darstellung in der Mantisse. Die ist auschlaggebend für das Phänomen, dass einige Zahlen nicht darstellbar sind (wie z.B. die 0,6 oder eine 0,1)

Deine Vorschläge sind super. Auch dass man Währungen lieber in cent abspeichern sollte. Die Erklärung mit dem ld kann ich jedenfalls nicht nachvollziehen. Ein DH bekommste trotzdem :)

1
NoHumanBeing 13.12.2015, 15:32
@Omnivore08

Zweierpotenzen lassen sich auf jeden Fall schön darstellen. ;-)

Aber Du hast Recht, 0.1 zur Basis 10 hat eine periodische ... wie soll man das nennen? "Dualbruchentwicklung"? ;-)

1

Was möchtest Du wissen?