Datentypen Float-Rundungsfehler

Arif

Aktives Mitglied
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?
 

Ullenboom

Bekanntes Mitglied
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.
 
K

kneitzel

Gast
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
RalleYTN float in WORD konvertieren Allgemeine Java-Themen 1
N OctetString --> Float Allgemeine Java-Themen 5
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
J Datentypen String in Float umwandeln und "umbauen"? Allgemeine Java-Themen 5
M float, double, BigDecimal Allgemeine Java-Themen 5
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
N Variablen Gleitkommazahlen - Kleineres float? Allgemeine Java-Themen 11
P Datentypen float mit komma statt punkt möglich? Allgemeine Java-Themen 6
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
B Variablen Bug of Float. & Double.MIN_VALUE! Allgemeine Java-Themen 4
Tobse 8 bit float Allgemeine Java-Themen 6
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
vandread Float/Double probleme bei der Multiplikation?! Allgemeine Java-Themen 3
F Float Division - Nachkommastelle bei 0 ausblenden Allgemeine Java-Themen 2
Developer_X "String" in "int" umwandeln, und dann "int" in "float" Allgemeine Java-Themen 8
G String nach Float parsen Allgemeine Java-Themen 2
E hex- Stirng in einen float umwandeln Allgemeine Java-Themen 9
MQue Float- Wert formatieren Allgemeine Java-Themen 8
E int vs. float vs. double Allgemeine Java-Themen 7
spacegaier Kommastellen aus float extrahieren Allgemeine Java-Themen 13
G WAV-Samples bearbeiten oder: 2 Bytes -> short -> float Allgemeine Java-Themen 5
J Float Formatierung? Allgemeine Java-Themen 6
P string zu float - darstellungsproblem Allgemeine Java-Themen 4
G Verständnisproblem double und float Allgemeine Java-Themen 7
W Division mit float und double Allgemeine Java-Themen 2
B Umwandeln von Bytes in float Zahl (DataInputStream) Allgemeine Java-Themen 3
W float/double verhält sich seltsam Allgemeine Java-Themen 6
R Float richtig in Integer ? Allgemeine Java-Themen 4
N Float zahl auf eine Stelle nach dem Komma runden Allgemeine Java-Themen 3
A Float-Wert auf 2 Stellen nach den Komma runden ? Allgemeine Java-Themen 2
H Multiplikation int*float Allgemeine Java-Themen 2
V Typumwandlung Integer, Float etc in String Allgemeine Java-Themen 4
S Rechnen mit float Zahlen Allgemeine Java-Themen 2
P Berechnungen: unterschiedliche Rundungsfehler bei Long? Allgemeine Java-Themen 3
F Rundungsfehler Allgemeine Java-Themen 18
ARadauer Rundungsfehler Allgemeine Java-Themen 6
T Problem: Double als Geldbetrag - Rundungsfehler Allgemeine Java-Themen 5
MQue Rundungsfehler Allgemeine Java-Themen 9
C Rundungsfehler? Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben