JAVA auf zwei Nachkomma stellen runden in der GUI,aber nur wie?
Möchte gerne meine Zahl auf zwei Nachkomma stellen runden.
Habe zwar diesen Code hier:
double mRabatt=glueck.rabatt_bestimmen();
mRabatt=Math.round(mRabatt);
lbRabatt.setText(String.valueOf(mRabatt));
jetzt ist das Problem das es immer nur auf ganz Zahl rundet,aber die Kommastellen trotzdem angibt die immer 0 sind. Kann mir jemand sagen wie man nun auf zwei Nachkomma stellen rundet?
3 Antworten
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");
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"? ;-)
Krass..
Wusste nicht das,dass so komplizert werden könnte.
Aber vielen Dank! Werde das mal umsetzten
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).
könnte man machen...wieso gibt es da bei Unix-Systemen Problemen? Habe es da noch nicht ausprobiert muss ich gestehen.
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.
mRabatt=Math.round(mRabatt*100)/100;
Kommt das selbe raus.
Also z.B. nur 3.0 mehr nicht
Jepp, weil es eine Integer-Division ist.
Musst jeweils 100.0 schreiben, statt 100, dann ist es eine Gleitkommazahl.
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 :)