Autor Beitrag
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Di 13.09.16 07:59 
Hallo zusammen

Ich habe ein unerwartetes Resultat aus folgender Berechnung erhalten:

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

oder
ausblenden 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.

_________________
Gruss
mats74
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
social.msdn.microsof...forum=csharplanguage
docs.oracle.com/cd/E...68/ncg_goldberg.html

Für diesen Beitrag haben gedankt: mats74
mats74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: 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.

_________________
Gruss
mats74
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 13.09.16 08:43 
Schau dir auch mal den Typ decimal 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 ^^