Um es noch einmal die Problematik zu verdeutlichen:
Dezimalwerte lassen sich oft nicht exakt im binären System abbilden. Dadurch kommen dann zwangsläufig Abweichungen.
Man hat halt nur eine begrenzte Menge Bits und man muss halt an die Zahl ran kommen mit einer Reiche von 2 hoch -x.
1.2 = 1 * 2^0 + 0 * 2^-1 + 0 * 2^-2 + 1 * 2^-3 + .... = 1.001......
[URL unfurl="true"]https://www.h-schmidt.net/FloatConverter/IEEE754.html[/URL]
zeigt dies für float - also mit geringerer Genauigkeit. Aber die Problematik kann man da auch schon sehr gut erkennen:
- Wenn Du da 1.2 eingibst, dann zeigt er Dir, dass er in Wirklichkeit keinen Wert von 1.2 speichert sondern er statt dessen mit 1.2000000476837158203125 rechnet.
- Bei 20.4 hat er bei float in Wirklichkeit einen Wert von 20.3999996185302734375 gespeichert.
Du erkennst die klare Abweichung an diesen Beispielen. Bei double wird die Genauigkeit höher, aber so Abweichungen bleiben. Und wenn Du dann damit rechnest, dann vervielfältigt sich so ein Fehler natürlich.
Oder eine andere Visualisierung:
[CODE=java] double summe = 0.0;
for (int i = 1; i <= 1000; i++) {
summe += 1.2;
System.out.println(i + " -> " + summe);
}[/CODE]
Schon bei 9 Additionen ist eine Abweichung zu erkennen: 9 -> 10.799999999999999