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?

War es hilfreich?

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

schreiben könnte
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 wird

Ändern Sie Ihre Art decimal:

decimal num = (3600.2m - 3600.0m);

Sie sollten auch lesen diese .

Siehe 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top