Heim >Backend-Entwicklung >C++ >Warum funktioniert „x == 0.1' nicht immer mit dem „double'-Datentyp von C#?

Warum funktioniert „x == 0.1' nicht immer mit dem „double'-Datentyp von C#?

Linda Hamilton
Linda HamiltonOriginal
2025-01-22 20:46:11631Durchsuche

Why Doesn't `x == 0.1` Always Work with C#'s `double` Data Type?

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. decimalWerte 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!

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