Detaillierte Erläuterung des Problems der Multiplikationsgenauigkeit mit doppelter Genauigkeit in .NET
In C# ist das Ergebnis des Ausdrucks double i = 10 * 0.69;
, dass i
der Wert 6,89999999999999995 anstelle des erwarteten 6,9 zugewiesen wird. Dies wirft die Frage auf: Stimmt etwas mit der Multiplikation mit doppelter Genauigkeit in .NET nicht?
Binärdarstellung und Gleitkommaoperationen
Um dieses Verhalten zu verstehen, muss man ein tiefes Verständnis für die Feinheiten der binären Darstellung und der Gleitkomma-Arithmetik haben. Gleitkommaformate stellen reelle Zahlen näherungsweise als endliche Binärwerte dar, was zu Genauigkeitseinschränkungen führen kann.
Der scheinbar einfache Wert 0,69 kann nicht genau binär ausgedrückt werden. Es erfordert eine Endlosschleifenfolge von Binärzahlen. Die im Datentyp double
gespeicherte Binärdarstellung ist eine Näherung von 0,69.
Compiler-Optimierung und gespeicherte Konstanten
Im bereitgestellten Codeausschnitt optimiert der Compiler den Ausdruck, indem er eine Multiplikation durchführt und das Ergebnis als Konstante in der ausführbaren Datei speichert. Dies geschieht, weil die Werte zur Kompilierzeit bekannt sind. Der gespeicherte Wert ist eine Gleitkomma-Näherung von 6,9, die etwas kleiner als der tatsächliche Wert ist.
Problemumgehungen und alternative Datentypen
Um dieses Problem zu lösen und genauere Ergebnisse zu erhalten, können Sie den Datentyp decimal
verwenden, der darauf ausgelegt ist, sich nicht wiederholende Dezimalwerte mit höherer Genauigkeit darzustellen. Der Ausdruck decimal i = 10m * 0.69m;
ergibt 6,9 Mio.
Das obige ist der detaillierte Inhalt vonIst die doppelte Multiplikation in .NET fehlerhaft?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!