Entwickler-Ecke

Basistechnologien - Falsches Berechnungsresultat aus Doublewerten


mats74 - Di 13.09.16 07:59
Titel: Falsches Berechnungsresultat aus Doublewerten
Hallo zusammen

Ich habe ein unerwartetes Resultat aus folgender Berechnung erhalten:


C#-Quelltext
1:
MessageBox.Show(Convert.ToString(8.53 - 7.53));                    

oder

C#-Quelltext
1:
MessageBox.Show(Convert.ToString(Convert.ToDouble(8.53) - Convert.ToDouble(7.53)));                    


Das Resultat beider Berechnungen ergibt auf meinem Rechner eine Gleitkommazahl von 0.99999...
Weitere Zahlenwerte ergeben ein mathematisch korrektes Resultat ( z.B. 8.53 - 7.55 = 0.98 oder 9.53 - 8.53 = 1 ).

Gibt es für diesen Umstand eine plausible Erklärung und wie kann ich diesen "Fehler" am Besten bereinigen?

Danke für eure Hilfe.


jaenicke - Di 13.09.16 08:23

Kurze Antwort:
Zahlen werden intern im Computer im Binärsystem gespeichert. Dadurch entstehen Rundungsdifferenzen zum Dezimalsystem. Deshalb solltest du bei der Ausgabe einer Zahl die Ausgabe auf die benötigte Anzahl an Nachkommastellen begrenzen.

Lange Antworten findest du hier:
https://social.msdn.microsoft.com/Forums/en-US/b5daaba2-0df6-49ba-a87c-f9b86e588e85/double-precision-issue-in-cnet-2005?forum=csharplanguage
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html


mats74 - Di 13.09.16 08:40

Hallo jaenicke

Vielen Dank für Deine Antwort.
Sie ist die Lösung meines Problems.

Ich werde gemäss Deinem Ansatz die Nachkommastellen bei entsprechenden Typenkonvertierungen berücksichtigen.


Palladin007 - Di 13.09.16 08:43

Schau dir auch mal den Typ decimal [https://msdn.microsoft.com/de-de/library/364x0z75.aspx] an.
Der stellt auch eine Fließkommazahl dar, aber mit erhöhter Genauigkeit.
Es können aber nicht so hohe Werte dargestellt werden, wie bei double, da mehr Platz für die Nachkommastellen gebraucht wird.

Ansonsten kannst Du auch die Nachkommastellen vor der Berechnung heraus rechnen und später wieder dazu rechnen.
Dadurch wird während der Berechnung der Wert zwar größer, aber double kann verdammt hohe Werte fassen ^^