Gleitkommazahlenvergleich in C#: Dezimaldilemma
In C# können beim Vergleichen von Werten vom Typ double
einige Probleme auftreten. Betrachten Sie den folgenden Code:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { // ... }</code>
Überraschenderweise kommt dieser Code nicht in die if
-Anweisung vor. Warum ist das so?
Problem mit Gleitkommazahlen
Die Wurzel des Problems liegt in der Art und Weise, wie Computer Gleitkommazahlen darstellen (insbesondere double
). Im Gegensatz zu ganzen Zahlen verwendet double
binäre Brüche anstelle von Dezimalbrüchen. Das bedeutet, dass einige Dezimalwerte, wie zum Beispiel 0,1, nicht exakt gespeichert werden können.
Zum Beispiel wird 0,1 in der Binärschreibweise als 0,000110011001100110011001 dargestellt.... Der Computer schneidet diese Endlosschleife von Dezimalstellen in eine endliche Darstellung ab, die möglicherweise nicht genau dem erwarteten Wert entspricht.
Lösung
Um dieses Problem zu lösen, können Sie die folgenden Methoden in Betracht ziehen:
decimal
: Der Typ decimal
speichert Zahlen in Dezimalschreibweise und ermöglicht so eine präzise Darstellung. Math.Abs(x - 0.1)
), um Gleitkommazahlen zu vergleichen. Erläuterung der Gründe
Binäre Brüche unterscheiden sich von dezimalen Brüchen in ihrer Fähigkeit, bestimmte Zahlen darzustellen. Beispielsweise kann die Zahl 1/10 nicht exakt binär dargestellt werden, was dazu führt, dass ihre Binärentwicklung ungefähr 0,0001100 beträgt... Der Rundungsprozess des Computers führt zu Ungenauigkeiten beim Speichern von Gleitkommazahlen.
Das obige ist der detaillierte Inhalt vonWarum funktioniert „x == 0.1' nicht mit „double x = 0.1' in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!