Heim >Backend-Entwicklung >C++ >Ist die doppelte Multiplikation in .NET fehlerhaft?

Ist die doppelte Multiplikation in .NET fehlerhaft?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-10 09:52:41739Durchsuche

Is Double Multiplication Broken in .NET?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn