kleine Kommazahlen erscheinen plötzlich

NicoHatProbleme2

Bekanntes Mitglied
ich rechne zum Beispiel 0.1 + 1.1 und daraus kommt dann 1.200...01 raus... auch, wenn ich mal 10 und dann (int) und dann wider durch 10 rechne, bleiben z.B. bei 0.1 + 4.1 ein paar Kommazahlen dran... wieso passiert sowas?
 
und was kann ich dagegen machen?
Wenn Du mit Gleitkommazahlen arbeitest: die Ausgabe entsprechend formatieren, z. B. liefert
Java:
double x = 1.1 + 0.1;
NumberFormat nf = NumberFormat.getInstance(Locale.US); // falls man den Punkt als Dezimaltrenner will
System.out.println(nf.format(x));
als Ausgabe 1.2.

Will man dagegen z. B. fix zwei Nachkommastellen, kann man String.format (bzw. printf) verwenden.
Java:
System.out.printf("%.2f", x);
liefert 1.20
 
Wenn Du mit Gleitkommazahlen arbeitest: die Ausgabe entsprechend formatieren, z. B. liefert
Java:
double x = 1.1 + 0.1;
NumberFormat nf = NumberFormat.getInstance(Locale.US); // falls man den Punkt als Dezimaltrenner will
System.out.println(nf.format(x));
als Ausgabe 1.2.

Will man dagegen z. B. fix zwei Nachkommastellen, kann man String.format (bzw. printf) verwenden.
Java:
System.out.printf("%.2f", x);
liefert 1.20
ich brauche diese Zahl halt zum Rechnen...
 
ich brauche diese Zahl halt zum Rechnen...
Das kommt darauf an, was und wie viel Du rechnest.

Wenn Du exakte Zahlen benötigst (insbesondere Geldbeträge), nimmst Du BigDecimal.

Oft wird aber mit Gleitkommazahlen gerechnet, wenn das ausreichend genau ist. Hier muss man ein wenig aufpassen, dass sich nicht zu viele Fehler aufaddieren. Man rechnet also einfach mit den fehlerbehafteten Werten und erst, wenn es um die Ausgabe geht, wird formatiert.

Nachtrag: natürlich kannst Du zwischendrin die Fehler etwas korrigieren.

Wenn Du also ein Ergebnis auf 2 Nachkommastellen brauchst, dann spielt es keine Rolle ob die Zahl ab der 20. NkSt fehlerhaft ist. Das ist genauso, wie wenn Du mit 1/3 oder Pi in Dezimalschreibweise rechnest: nach ein paar Kommastellen hörst Du auf und rechnest mit dem Wert weiter.
 
aber eigentlich brauche ich nur 1 Nachkommazahl
Wie gesagt: normal spielt das keine Rolle. Wenn Du ein Zwischenergebnis ein klein wenig korrigieren willst:
Java:
double x = 1.1 + 0.1;
double y = ((int)(x * 100)) / 100.0;
System.out.println(x);
System.out.println(y);
System.out.println(10/x);
System.out.println(10/y);

NumberFormat nf = NumberFormat.getInstance(Locale.US); // falls man den Punkt als Dezimaltrenner will
System.out.println(nf.format(10/x));
System.out.println(nf.format(10/y));

Nachtrag: Ausgabe durch 10/x bzw. 10/y ersetzt.

Du siehst, der Fehler ist minimal und bei einer formatierten Ausgabe, kommt das gleiche raus.
 
bei mir macht der nach 40 mal
Java:
m += magnification;
m = (int) (m*100);
m/=100;
(...)
magnification = m;
mit m = 0.1
faxen:
1.1
(...)
4.0
4.09
4.18
4.27
usw.
 
Wie gesagt: normal spielt das keine Rolle. Wenn Du ein Zwischenergebnis ein klein wenig korrigieren willst:
Java:
double x = 1.1 + 0.1;
double y = ((int)(x * 100)) / 100.0;
System.out.println(x);
System.out.println(y);
System.out.println(10/x);
System.out.println(10/y);

NumberFormat nf = NumberFormat.getInstance(Locale.US); // falls man den Punkt als Dezimaltrenner will
System.out.println(nf.format(10/x));
System.out.println(nf.format(10/y));

Nachtrag: Ausgabe durch 10/x bzw. 10/y ersetzt.

Du siehst, der Fehler ist minimal und bei einer formatierten Ausgabe, kommt das gleiche raus.
aber ich brauche einen boolean
 
was willst du mit dem boolean machen ?

es gibt noch Math.Approximately falls dir das was hilft
 
Entschuldigung, habe was falsches geschrieben, meint double...
Ich rechne immer, wenn ich eine Taste drücke, etwas plus 0.1, um damit eine Vergrößerung zu machen... Dafür brauche ich halt double / float...
 
Verwende int, zähl jeweils +1 dazu. Sobald du den Wert irgendwo brauchst, dividiere durch 10.0 oder 10d (damit wird der Int-Wert vorher nach double konvertiert und du erhälst deine Nachkommastellen).

Oder eben arbeite wie oben beschrieben mit BigDecimal.
 

Zurück
Oben