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

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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");

Krass..

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

Aber vielen Dank! Werde das mal umsetzten

1

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
@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

probiers mal

lbRabatt.setText(String.format("%.2f", lbRabatt ));

Er sollte wohl besser die Drei-Parameter-Überladung von String.format benutzen und noch einen Parameter null davorhängen, ansonsten wird seine Ausgabe abhängig von der Betriebssystemsprache formatiert, was in aller Regel nicht das ist, was man möchte (keine reproduzierbaren Ergebnisse auf "fremden" Rechnern).

0
@NoHumanBeing

könnte man machen...wieso gibt es da bei Unix-Systemen Problemen? Habe es da noch nicht ausprobiert muss ich gestehen.

1
@Omnivore08

Das hat nichts mit Unix zu tun.

Es könnte z. B. sein, dass Du auf einem deutschsprachigen Windows "3,50" bekommst, aber auf einem englischsprachigen Windows "3.50".

Das ganze beschränkt sich natürlich nicht auf Windows, sondern wird bei anderen Systemen ähnlich sein.

Vielleicht gibt es ja noch andere Sprachen, in denen es irgendwelche ganz "obskuren" Zahldarstellungen gibt, wer weiß. Vielleicht bekommst Du irgendwann mal römische Ziffern raus, wenn Du ein ganz "obskures" Locale in Deinem System einstellst.

0
mRabatt=Math.round(mRabatt*100)/100;