Heim >Backend-Entwicklung >C++ >Warum funktioniert „x == 0.1' nicht immer mit dem „double'-Datentyp von C#?
C# double
Vergleiche: Präzisionsprobleme
Das Arbeiten mit Gleitkommazahlen (wie dem double
-Typ von C#) bringt beim Vergleichen von Werten oft unerwartete Herausforderungen mit sich. Ein häufiges Beispiel ist der Vergleich einer double
-Variable mit 0,1:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { /* Code */ }</code>
Dieser scheinbar einfache Vergleich könnte überraschenderweise scheitern.
Das Problem verstehen: Binäre vs. dezimale Darstellung
Die Hauptursache liegt in der Art und Weise, wie Gleitkommazahlen gespeichert werden. double
Werte werden als binäre Brüche und nicht als Dezimalbrüche gespeichert. Dies bedeutet, dass viele Dezimalwerte, einschließlich 0,1, nicht präzise als binärer Bruch dargestellt werden können. Der Computer speichert stattdessen eine Annäherung, was zu subtilen Unterschieden führt, die sich auf Vergleiche auswirken.
Die Lösung: Verwendung des decimal
Datentyps
Um dieses Genauigkeitsproblem zu vermeiden, verwenden Sie den Datentyp decimal
. decimal
Werte werden in Dezimalschreibweise gespeichert, was eine genaue Darstellung von Zahlen wie 0,1 ermöglicht.
<code class="language-csharp">decimal x = 0.1m; if (x == 0.1m) { /* Code */ }</code>
Die Verwendung von decimal
gewährleistet eine genaue Speicherung und einen genauen Vergleich von 0,1.
Gleitkommadarstellung: Ein tieferer Blick
Um das Problem zu veranschaulichen, betrachten Sie die Dezimaldarstellung. 12.34 ist:
<code>1 * 10^1 + 2 * 10^0 + 3 * 10^-1 + 4 * 10^-2</code>
In ähnlicher Weise ist 0,1:
<code>1 * 10^-1</code>
Im Binärformat fehlt jedoch für einige Zahlen (z. B. 1/10 oder 0,1 Dezimalzahl) eine präzise Darstellung. Sie sind angenähert, was zu Abweichungen führt, die bei Vergleichen zu unerwarteten Ergebnissen führen. Diese Näherung ist der Grund, warum x == 0.1
möglicherweise fehlschlägt, wenn x
ein double
ist.
Das obige ist der detaillierte Inhalt vonWarum funktioniert „x == 0.1' nicht immer mit dem „double'-Datentyp von C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!