Datentypen Float-Rundungsfehler

Diskutiere Float-Rundungsfehler im Allgemeine Java-Themen Bereich.
Arif

Arif

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?
 
T

thecain

Nicht mit float.
BigDecimal ist eine Option oder mit ints zu zählen und dann zu dividieren
 
mihe7

mihe7

Gibt es keine Lösung für dieses Problem?
Wenn Du die Ausgabe meinst: was machst Du denn, wenn Du dezimal 2/3 auf Papier aufschreibst? Runden. Kannst Du hier auch:
System.out.printf("%.1f\n", x);

Wenn es Dir nicht um die Ausgabe sondern um eine exakte Darstellung des Wertes geht, dann s. @thecain.
 
Ullenboom

Ullenboom

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.
 
J

JustNobody

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.
 
Thema: 

Float-Rundungsfehler

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben