Für Kommazahlen mit bis zu 4 Nachkommastellen kannst du decimal (System.Decimal) verwenden. Dabei treten keine Rundungsverluste oder Ungenauigkeiten ein.
Aus diesem Grund sollten Gleitkommazahlen auch nicht mit == auf Gleichheit geprüft werden sondern durch die Differenz der Abweichung soll mit einem Epsilon verglichen werden. Das Epsilon stellt dabei den Wert der "Ungenauigkeit" der Gleitkommazahl dar.
Nicht verwendet werden soll: if (double1 == double2)
sondern: if (Math.Abs(double1 - double2) < epsilon) wobei epsilon zB 0.00001 ist.
Vielen Dank, kannte ich nicht. Dachte immer Decimal wäre mit seinen 28-29Stellen schon genau genug, aber Maschinengenau mit epsilon, das hat was, super! : )
Ich verstehe nicht, was das mit der Frage zu tun hat. Die Genauigkeit spielt leine Rolle, da beide Summanden die selbe Darstellung/Bitmust haben, so sollte X - X immer 0 sein, da sie ja das gleiche Bitmuster haben.
Richtig ist, dass es unsinnig ist doubles auf Gleichheit zu vergleichen, der Vorschlag gegen ein epsilon zu vergleichen ist grober Unfug den es führt zu folgendem:
@stefan.bachert: Warum soll der Vergleich mit epsilon ein grober Unfug sein? Im oberen Kommentar (der mit dem Link) ist eine weiterführende Betrachtung die du scheinbar nicht gelesen hast.
In der Numerik wird seit jeher mit epsilon verglichen. Die Wahl für epsilon ist in der Antwort nicht definiert und somit ist dein Beispiel aus deinem Kommentar Schwachsinn der auf Unverständnis der Numerik beruht.
Die eigentliche Ursache für dieses Problem ist die interne Darstellung: 0.1 hat keine endliche Darstellung in Binärform. Binär 0.1 entspricht Dezimal 0.5 Binär 0.01 entspricht Dezima 0.25 Binär 0.001 entspricht Dezimal 0.125 Binär 0.0001 entspricht Dezimal 0.0625 .... Dezimal 0.1 entspricht Binär 0.00011001100110011.... Da wir im Rechner aber nur endlich viele Stellen abspeichern, entsteht ein Rundungsfehler. So entsrpeicht Binär 0.00011001100110011 eben Dezimal 0,099998474 was zwar fast 0.1 ist, aber eben nur fast. Um sowas bei Geldbeträgen zu vermeiden, rechnet man intern gerne mit Cent anstelle von Euro.
Dieses Phänomen tritt bei Kommazahlen am Computer häufig auf. float und double sind [Gleitkommazahlen][1], d.h. sie haben nur eine beschränkte Genauigkeit.
Ich weiß dass du sicher 0.35 + -0.35 gemeint hast ;)