[JAVA] Zahlen addieren ungenau!?

MyKron

Commodore Special
Mitglied seit
15.01.2002
Beiträge
499
Renomée
1
Standort
Berlin
  • QMC Race
  • SIMAP Race
Hi Forum!

Ich habe vor einem Monat angefangen Java zu lernen, jetzt sitze ich am ersten Programm und stolpere ueber folgendes Problem:

Code:
for (float temp = -0.5F; temp<=0.5F; temp = temp + 0.1F){
    System.out.println(temp);
}

liefert mir die folgende Ausgbe:

-0.5
-0.4
-0.3
-0.20000002
-0.10000002
-1.4901161E-8
0.09999999
0.19999999
0.29999998
0.39999998
0.49999997


Hab ich was bei den Datentypen falsch gemacht??
Wenn ich die Genauigkeit auf Double erhoehe hab ich das Problem auch.
 
Mit float/double kann man nicht 100%ig genau rechnen.
Die Fehler kommen dadurch das man Gleitkomma Zahlen nicht immer in Bits ausdrücken kann, deswegen gibt es kleine Rundungsfehler
EDIT:
Btw: Warum macht du nicht die Schleife mit Integer Werten und teilst durch 10?
 
Nim Integer immer wenn möglich (bzw. es nicht zuviel Aufwand macht).

1.0 lässt sich nicht genau als Fließkommazahl darstellen, allerdings hat ein float auch nur 32bit. 64bit floats bekommst du mit "double".
 
vielen dank für die hinweise, leider macht der code sehr viel aufwand wenn ich integer benutzter, ich werde aber wohl nicht drum herum kommen. das ganze projekt wird immer komplizierter, das habe ich irgendwie in einer andren sprache schon mal leichter geschafft glaube ich. gibt es eine alternative zu Applets ;-)
 
Na sonst nimm doch einfach doubles, die sind ^2 mal so genau ;)

Allerdings musst du bei Floats immer auf == verzichten, und damit hat jede Sprache ihre Probleme - also wenn du bei einer anderen Sprache Floats nimmst hast du das selbe Problem.
 
wie ich oben schrieb, nimmt sich das nichts, ob ich nun double oder float nehme, die nachkomma stellen erhöhen sich nur, ich will doch nur ein koordinatensystem beschriften, vielleicht schneide ich die nachkomma stellen einfach ab nd überlege mir einen algorythmus, der das ab der 2. stelle nach allen nachkomma nullen tut, falls der wert kleiner al 1 ist. ich bastle noch ein wenig, zumindest weiss ich jetzt, dass es nicht an mir liegt!
 
Du kannst den Wert auch einfach runden, oder bei der Ausgabe nur eine Nachkommastelle ausgeben (die weggelassen wird wenn die 0 ist) oder sowas in der Art machen ;)


Jetzt frag mich aber nicht nach den Rundungsfunktionen, da musst du googeln (findet sich sicher schnell was).
 
leider gibt es ja kein runden in Java, ich müsste zum beispiel um 10.25 zu runden den wert mal hundert nehmen ihn in einen int umwandeln und wieder durch hunder teilen

Code:
((float)((int)(10.25*100)))/100

was aber wenn ich nicuht weiss wie die zahl aussieht?? sie kann auch 0.0001025 sein oder 10250, da wird das dann schon wieder umständlich!
 
Zurück
Oben Unten