Java Eclipse: Rundungsfehler bei double - double?

Java 1 - (Computer, Java, Eclipse) Java 2 - (Computer, Java, Eclipse)

5 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Das Proben ist das der Computer die Zahl in der wissenschaftlichen Schreibweise mit einer begrenzten Genauigkeit abspeichert.
Im Dezimalsystem würde die 2,76 zum Beispiel als 276 * 10^-2 , geschrieben werden.
Da das ganze binär mit einer begrenzten Anzahl von Bits passiert kommt es sehr leicht zu Rundungsfehler.
Ein schönes Beispiel wäre es wenn z.B. eine periodische Zahl herauskommt.

Falls du dich genauer dafür interessiert kannst du mal nach iii754 suchen.

P.S. bei Gleitkommazahlen wird aus diesem Grund z.B. nie ein Test auf 0 (x==0) durchgeführt sondern eher mit einem Epsilon gerechnet (|x| < e).
Konkret: |x| < 0.0001 (Die Zahl sollte passend gewählt werden)

Rechne in deiner Anwendung mit Cent statt mit Euro. Dann brauchst du keine double sondern nur int. Für die Darstellung nimmst du

System.out.printf("%.2f EUR",wert/100.0)

Jeder nicht ganzzahlige Euro-Betrag außer x+0,25 und x+0,50 und x+0,75 (also 1/4 , 1/2 und 3/4) ist ein nichtabbrechender, periodischer Binärbruch und daher in double wegen der begrenzten Stellenzahl nicht exakt darstellbar.

Das sollte man als (angehender) Programmierer früh lernen und dann wissen und nicht wieder vergessen.

Kann man bei Java Eclipse etwa nicht 2 double voneinander abziehen?

Eclipse kann da nichts für. Nachkomma-Stellen werden in Java als Bruch in einer Binärzahl gespeichert.

Davon abgesehen ist es möglich. Im direkten Weg erhälst du Natürlich  eine entsprechende Rundungsdifferenz als Ergebnis.

Dass dir das nicht gefällt, kann ich mir schon vorstellen, jedoch würde ich dann dazu raten auf entsprechende Klassen zurück zugreifen mit denen das möglich ist, wie BigDecimal.

BigDecimal.valueOf(2.76).subtract(BigDecimal.valueOf(1.75)).doubleValue();

Das ist ganz normal und liegt einfach nur daran, dass ein Computer nicht mit unendlicher Genauigkeit rechnen kann, Runde die Zahl einfach auf 7 Nachkommastellen und das Ergebnis stimmt.