Weird-Ergebnis, wenn Subtraktion verdoppelt [Duplikat]
Frage
Mögliche Duplizieren:
Warum ist Gleitkomma-Arithmetik in C # ungenau?
Ich habe mit einigen Zahlen und C # beschäftigt, und der folgenden Codezeile Ergebnisse in einer anderen Zahl als man erwarten würde:
double num = (3600.2 - 3600.0);
Ich erwartete num 0,2, jedoch zu sein, es stellte sich heraus, ,1999999999998181 zu sein. Gibt es einen Grund, warum es eine enge, aber noch ist anders dezimal?
Lösung
Das ist, weil double
ein Gleitkomma-Datentyp ist.
Wenn Sie eine größere Genauigkeit wollen Sie stattdessen mit decimal
wechseln könnte.
Die wörtliche Suffix für decimal
ist m, so decimal
Arithmetik zu verwenden (und ein decimal
Ergebnis erzeugen) Sie Ihren Code wie
var num = (3600.2m - 3600.0m);
Beachten Sie, dass es Nachteile sind eine decimal
zu verwenden. Es ist ein 128-Bit-Datentyps zu 64 bit gegenüber, die die Größe eines double
ist. Dies macht es teurer sowohl in Bezug auf Speicher und Verarbeitung. Es hat auch einen viel kleineren Bereich als double
.
Andere Tipps
Es gibt einen Grund.
Der Grund dafür ist, dass die Art und Weise der Zahl im Speicher, bei dem doppelten Datentyp gespeichert ist, nicht für eine exakte Darstellung der Zahl 3600,2 zuzulässt. Es ist auch nicht zulassen, dass für eine exakte Darstellung der Zahl 0,2.
0,2 hat eine unendliche Darstellung in binär. Wenn Sie wollen, es zu speichern, im Speicher oder Prozessorregister, um einige Berechnungen durchführen, einige Zahl der Nähe von 0,2 mit endlicher Darstellung wird stattdessen gespeichert. Es ist vielleicht nicht offensichtlich sein, wenn Sie Code wie folgt ausgeführt.
double num = (0.2 - 0.0);
Das ist, weil in diesem Fall alle binären Ziffern für Zahlen in doppelter Datentyp darstellen, werden verwendet, um den Bruchteil der Zahl darstellen (es gibt nur der Bruchteil) und die Präzision höher ist. Wenn Sie die Nummer speichern 3600,2 in einem Objekt vom Typ Doppel werden einige Ziffern verwendet, um den ganzzahligen Teil zu repräsentieren - 3600, und es gibt weniger Ziffern repräsentieren Bruchteil. Die Präzision und geringer Bruchteil, der in der Tat in dem Speicher unterscheidet sich von 0,2 genug gelagert ist, dass es nach der Umwandlung von doppelt auf Zeichenfolge
offensichtlich wirdSiehe Wikipedia
Kann nicht erklären, es besser. Ich kann auch das Lesen vorschlagen Was jeder Informatiker wissen sollten über Gleitkommaarithmetik . Oder sehen ähnliche Fragen auf Stackoverflow.