double-Krise

oldwise

Grünschnabel
Hi.

Mich wundert es doch sehr, dass java bei folgendem Code folgendes liefert:

Code:
for(double x = -5.0; x <= 5.0; x += 0.05)
        {            
            System.out.println(x);
        }

-5.0
-4.95
-4.9
-4.8500000000000005
-4.800000000000001
-4.750000000000001
-4.700000000000001
-4.650000000000001
-4.600000000000001
-4.550000000000002
-4.500000000000002
-4.450000000000002
-4.400000000000002
-4.350000000000002
-4.3000000000000025
-4.250000000000003
-4.200000000000003
-4.150000000000003
-4.100000000000003
-4.050000000000003
-4.0000000000000036
-3.9500000000000037
-3.900000000000004
-3.850000000000004
-3.8000000000000043
-3.7500000000000044
-3.7000000000000046
-3.650000000000005
-3.600000000000005
-3.550000000000005
-3.5000000000000053
-3.4500000000000055
-3.4000000000000057
-3.350000000000006
-3.300000000000006
-3.250000000000006

Wie kann ich dem Herr werden? Einen extra Rundungsalgorithmus möchte ich eigentlich vermeiden.
 

Xandro

- Mistkerl -
Moin,

da kommst Du nicht drum herum, es zu Runden oder per NumberFormat abzuschneiden.
Das Runden wäre doch eigentlich nur eine kleine Erweiterung:
Java:
for (double x = -5.0; x <= 5.0; x += 0.05) {
  System.out.println(Math.round(x * 100) / 100.0);
}
Gruß,
Xan
 

oldwise

Grünschnabel
Sicher, dass ist nicht das Problem. Ich bin nur gerade darüber erschrocken das bei der 2. NKS und einer simplen Addition schon eine ganze Rechnung vor den Baum geht. :mad:
 

Evil83

Grünschnabel
Das ist aber immer so, das liegt ganz einfach daran, dass der Computer nicht beliebige Zahlen darstellen kann.

Wenn du anstatt 0.05 immer schön 0.0625 (2^ -4 )oder 0,03125 (2^ -5 ) addierst, dann sollten die Rundungsfehler nicht auftreten.


Im übrigen solltest du bei Dezimalzahlen sowieso nur mit Toleranz auf z.B. Gleichheit testen, so dass geringfügige Ungenauigkeiten nicht so sehr ins Gewicht fallen.