PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [JAVA] Zahlen addieren ungenau!?


MyKron
16.07.2004, 16:26
Hi Forum!

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


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.

Dizzy_Ti
16.07.2004, 17:19
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?

i_hasser
16.07.2004, 23:15
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".

MyKron
17.07.2004, 00:42
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 ;-)

i_hasser
17.07.2004, 00:53
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.

MyKron
17.07.2004, 01:01
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!

i_hasser
17.07.2004, 01:09
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).

MyKron
17.07.2004, 01:14
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


((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!

i_hasser
17.07.2004, 01:20
Bei der Ausgabe muss Java auf jeden Fall irgendwie Rundungsfunktionen bieten...

http://www.google.de/search?q=java+round+float+output&ie=UTF-8&hl=de&btnG=Google-Suche&meta=

Gleich der 3. Treffer passt haargenau, ich hab doch gesagt googeln hilft dir ;)

http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_21008374.html

da wird zb. irgendwo das hier genommen:

Math.round()

Also kennt Java Rundungsfunktionen, hätte mich auch arg gewundert wenn nicht.

MyKron
17.07.2004, 01:34
leider ist math.round nicht das was ich brauche, wie ich oben beschrieben habe, aber vielleicht hilft BigDecimal mir weiter, das mach ich aber nicht mehr heute nacht!!

http://www.torsten-horn.de/techdocs/java-basics.htm#FormatierungRundung

Novox
18.07.2004, 02:55
0,1 ist das Problem, das läßt sich mit Floats nicht exakt darstellen.
Die Lösung heißt Fixed Point Arithmetik und genau das macht man mit BigDecimal: Tricks and traps with floating point and decimal numbers (http://www-106.ibm.com/developerworks/java/library/j-jtp0114)



Copyright © 1999 - 2011 Planet 3DNow!
Rechtliche Hinweise