Autor Beitrag
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 178
Erhaltene Danke: 25

Win 7
VS 2010, 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: 18659
Erhaltene Danke: 1608

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), 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

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

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

Win 7
VS 2010, 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: 1154
Erhaltene Danke: 148

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
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 ^^