Simon Reinhardt: Fließkommafehler

Beitrag lesen

Hi Forum!

Java hat anscheinend extreme Fehler in der Fliesskommaberechnung.
Hier ein kleiner Auszug aus meinem Programm:

for (double x=section.from; x<=section.to; x+=section.step)
{
System.out.println(x);
calcedpoints.add(calcpoint(term, var, x));
}

Das Programm geht double-Werte im Bereich von section.from (-3) bis section.to (3) in der Schrittweite section.step (0.2) durch und berechnet dazu Werte.
Mit System.out.println lasse ich mir die x-Werte Testweise ausgeben und erhalte vollkommen Krumme Nachkommastellen:

-3.0
-2.8
-2.5999999999999996
-2.3999999999999995
-2.1999999999999993
-1.9999999999999993
-1.7999999999999994
-1.5999999999999994
-1.3999999999999995
-1.1999999999999995
-0.9999999999999996
-0.7999999999999996
-0.5999999999999996
-0.39999999999999963
-0.19999999999999962
3.885780586188048E-16
0.2000000000000004
0.4000000000000004
0.6000000000000004
0.8000000000000005
1.0000000000000004
1.2000000000000004
1.4000000000000004
1.6000000000000003
1.8000000000000003
2.0000000000000004
2.2000000000000006
2.400000000000001
2.600000000000001
2.800000000000001

Wie ihr seht, stimmen nur ersten beiden Werte.
Anscheinend hat JavaScript das gleiche Problem, da dies hier schon mal beschrieben wurde. Folgender Tip wurde damals gegeben:

var zahl1 *= 100;
var zahl2 *= 100;

var zahl3 = zahl1 + zahl2;

zahl3 /= 100;

Auf mein Problem angewandt ergibt das folgenden Code:

double x=section.from;
while(x<=section.to)
{
System.out.println(x);
calcedpoints.add(calcpoint(term, var, x));
x*=100;
x+=section.step*100;
x/=100;
}

Aber auch das gibt keine wirklich zufriedenstellenden Ergebnisse:

-3.0
-2.8
-2.6
-2.4
-2.2
-2.0000000000000004
-1.8000000000000005
-1.6000000000000005
-1.4000000000000006
-1.2000000000000006
-1.0000000000000007
-0.8000000000000007
-0.6000000000000008
-0.4000000000000008
-0.2000000000000008
-7.815970093361102E-16
0.1999999999999992
0.39999999999999925
0.5999999999999992
0.7999999999999992
0.9999999999999991
1.199999999999999
1.3999999999999988
1.5999999999999988
1.799999999999999
1.999999999999999
2.199999999999999
2.399999999999999
2.5999999999999988
2.799999999999999
2.9999999999999987

(Vielen Dank an alle, die bis hierhin tapfer durchgehalten haben ;-) )

Fuer mein Programm ist es unabdingbar, vollkommen exakte Werte zu erhalten. Da es auch vorkommen kann, dass sich section in Bereichen wie -0.00000001 bis 0.00000001 bewegt, hilft auch kein Runden.
Wie kann ich Java dazu bringen, richtig zu rechnen?
Warum kann Sun noch nicht mal die Addition von Fliesskommawerten exakt implementieren?

Bitte helft mir, ich bin total verzweifelt...

MfG Simon