Heim >Backend-Entwicklung >C++ >Wie kann ich Doppelwerte in C# sicher vergleichen?
Zuverlässige Möglichkeit, Doppelwerte in C# zu vergleichen
In C# führen Vergleiche von Werten mit doppelter Genauigkeit aufgrund der inhärenten Einschränkungen der Gleitkomma-Arithmetik häufig zu unerwarteten Ergebnissen. Um zu verstehen, warum dies geschieht, untersuchen wir die Gründe für die mangelnde Gleitkomma-Präzision.
Unzureichende Gleitkommagenauigkeit
Die Datentypen float und double speichern numerische Werte im Binärformat. Diesem Format fehlt von Natur aus die Präzision, um bestimmte Zahlen, einschließlich einfacher Dezimalwerte wie 0,1, genau darzustellen. Wenn double der Wert 0,1 zugewiesen wird, speichert es tatsächlich eine binäre Darstellung, die eine Annäherung an den wahren Dezimalwert darstellt. Dieser Mangel an Präzision ist auf die Natur der Umwandlung von Dezimalzahlen in binäre Brüche zurückzuführen.
Mögliche Lösungen
Um den Vergleich doppelter Werte effizient durchzuführen, sollten Sie die folgende Lösung in Betracht ziehen:
Vergleich von Double-to-Double-Werten: Beim Vergleich von Double-Werten wird die Verwendung des Gleichheitsoperators (==) generell nicht empfohlen. Stattdessen können Näherungsvergleichsmethoden verwendet werden, um mögliche Rundungsfehler zu berücksichtigen. Dabei geht es in der Regel darum, einen Toleranzwert zu definieren und zu vergleichen, ob die Differenz zwischen zwei Werten kleiner als diese Toleranz ist.
Dezimaler Datentyp: Für präzise numerische Operationen und Vergleiche sollten Sie die Verwendung des dezimalen Datentyps in Betracht ziehen, der Werte in Dezimalschreibweise speichert. Dieser Ansatz gewährleistet eine genaue Darstellung von Dezimalwerten wie 0,1.
Zusätzliche Anweisungen
Der Mangel an Präzision bei Float- und Double-Speicherung ist auf die Tatsache zurückzuführen, dass die binäre Darstellung natürlicherweise zu numerischen Werten passt, die Potenzen von 2 sind, wie z. B. 1/2, 1/4 usw. Allerdings kann ein Dezimalbruch mit einem bestimmten Nenner, beispielsweise 0,1 (1/10), nicht exakt binär dargestellt werden, ohne dass Rundungsfehler auftreten.
Beispiel
<code class="language-csharp">double x = 0.1; double y = 0.1; double tolerance = 0.000001; // 定义容差 if (Math.Abs(x - y) < tolerance) // 使用容差进行近似比较 { // 代码块 }</code>
In diesem Beispiel wird gezeigt, wie mit Math.Abs()
die absolute Differenz zwischen zwei Double-Werten berechnet und mit einer vordefinierten Toleranz verglichen wird, was einen zuverlässigeren Vergleich von Double-Werten ermöglicht. Die Wahl eines geeigneten Toleranzwerts hängt vom spezifischen Anwendungsszenario und den Genauigkeitsanforderungen ab.
Das obige ist der detaillierte Inhalt vonWie kann ich Doppelwerte in C# sicher vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!