Datentypen Float-Rundungsfehler

Hallo, ich will von -3 bis 3 mit einer float-Variable durchlaufen. Dabei will ich in 0.1er Schritte iterieren.
Wenn ich den folgenden Code ausführe
Java:
for (float x = -3f; x <= 3; x += 0.1f) System.out.println(x);
Erhalte ich folgende Ausgabe
Code:
-3.0
-2.9
-2.8000002
-2.7000003
-2.6000004
-2.5000005
-2.4000006
-2.3000007
-2.2000008
-2.1000009
-2.000001
-1.9000009
-1.8000009
-1.7000009
...
Gibt es keine Lösung für dieses Problem?
 
Durch die Addtion von 0.1 wird natürlich die Ungenauigkeit immer addiert. Ein alternativer Vorschlag: Du nutzt int zum Zählen, gehst von -30 bis +30, und teilst später durch 10. Die Nachkommastellen schneidest du mit printf wie schon beschrieben ab.
 
Evtl. ist es auch interessant, hier einmal die Hintergründe zu erfahren, wieso es denn zu diesen Ungenauigkeiten kommt. Man hat ja immer 0.1 abgezogen. Woher kommen denn diese Ungenauigkeiten?

Hintergrund ist die Art und Weise, wie Gleitkommazahlen gespeichert werden. Dies wird ausführlich in https://de.wikipedia.org/wiki/Gleitkommazahl beschrieben.

In Kurz:
Die Zahl wird aufgeteilt in Mantisse und Exponent. Im Zehnersystem kennen wir dies auch etwas:
100 ist dann z.B. 1*10^2. Oder 0,01 ist 1*10^-2.
0,1 ließe sich im 10er System also als 1 * 10^-1 darstellen.

Nun kommt aber leider hinzu, dass wir uns im dualen System befinden. Und eine Zahl, die im 10er System einfach dargestellt werden kann, kann im dualen System leider nicht so dargestellt werden. Auf der Seite findet sich dann z.B. eine Umrechnung der Zahl 18,4 und da wird dann deutlich: die 0,4 ist im dualen System nicht so einfach darstellbar. Ähnlich wie bei 1/3 im Zehnersystem ein unendliche Zahlenreihe heraus kommt: 0,3333333..... ist die 0,4 im Dualen System 0,01100110011001100110.....

Da aber nun nur eine gewisse Stellenzahl gespeichert wird, kommt eine Ungenauigkeit in Spiel. Und mit dieser Ungenauigkeit wird dann gerechnet. Also wenn man das im Zehnersystem als Beispiel nimmt:
Statt mit 1/3 rechne ich mit 0,33333. Dann addiere ich das drei mal und dann habe ich nur 0,99999 und eben nicht 1.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben