# double Rundungsfehler od. Anzeige-Fehler?



## beginner99 (11. Aug 2009)

Hallo,

in einer bereits nicht mehr so simplen Test (bzw. Schulungsprojekt) führe ich folgende triviale Rechnung durch:

2.05 - 0.05

allerdings stehen die zahlen nicht so im code, sondern werden zur laufzeit ermittelt.
Also steht da eher zahl1 -  zahl2.

Das ergebnis ist dann 1.1999999999999998

Zähle ich nun wieder 0.05 dazu ist es wieder korrekt: 2.25

Ziehe ich nun wieder 0.05 ab ist der Wert 2.1999999999999997

usw.

Die Aussgabe erfolgt mittels println aber auch der debugger zeigt diese werde an.
"intern" scheinen sie ja aber korrekt zu sein? wie bekomme ich dann eine korrekte anzeige?


----------



## Schandro (11. Aug 2009)

der Wert ist "intern" 1.1999999999999998, dass ist kein Anzeigeproblem.

Das musst du in Kauf nehmen, wenn du mit Gleitkommazahlen (float oder double) arbeitest. Wenn du die Zahlen ganz genau brauchst, benutz BigDecimal


----------



## Der Müde Joe (11. Aug 2009)

immer wieder schön:
What Every Computer Scientist Should Know About Floating-Point Arithmetic


----------



## beginner99 (11. Aug 2009)

Der Müde Joe hat gesagt.:


> immer wieder schön:
> What Every Computer Scientist Should Know About Floating-Point Arithmetic



Ich muss zugeben, dass ich den Artikel nicht gelesen habe. Mir ist das Grundproblem mit den rundungsfehlern bekannt. Nur bei 2.05 - 0.05 sollte das doch kein Problem sein?

Das sowas wie 9.45e56 -1 nicht ideal ist verstehe ich. Ich bin kein Programmier oder Computer Scientist (geschweige den Mathematiker) und muss auch nichts berauschendes oder komplexes erstellen.

Aber sagen wir mal python wird bei meiner rechnung oben nie 1.99999997 oder so ausspucken. Ebenso nicht excel-vba, da hab ich für solche "trivialrechnungen" noch nie solche probleme gesehen. 
ich brauch die Zahl ja nicht exakt, auf 2 stellen ist gut genug nur muss ich jetzt überall bei jeder Rechnung vor der ausgabe noch Runden, obwohl es programm bedingt nur in 0.05 schritten ändern kann und ich das ergebnis auch genau so exakt brauche?


----------



## Illuvatar (11. Aug 2009)

Wenn in einer anderen Sprache das Ergebnis besser aussieht, liegt das vermutlich daran, dass in der Ausgaberoutine gerundet wird. Prozessoren rechnen so wie in dem Artikel oben beschrieben ist, und da kommen eben auch bei "trivialen" Rechnungen Rundungsfehler vor.

Du kannst jetzt:

Rechnen wie bisher und auf zwei Stellen nach dem Komma runden
Wie vorgeschlagen BigDecimal verwenden - BigDecimal rechnet exakt, solange keine nicht abbrechenden Dezimaldarstellungen vorkommen.


----------

