Heim >Backend-Entwicklung >C++ >Warum führt die Floating-Punkt-Arithmetik in C# beim Vergleich scheinbar gleicher Werte unerwartete Ergebnisse?
C# Floating-Punkt-Arithmetik: Präzisions- und Vergleichsfallfall
Die Gleitkomma-Arithmetik vonC#leiden zwar bequem und litt in der inhärenten Ungenauigkeit aufgrund ihrer endlichen Darstellung. Dies kann zu unerwarteten Ergebnissen führen, wenn scheinbar gleiche Werte verglichen werden.
Betrachten Sie dieses Beispiel:
<code class="language-csharp">class Program { static void Main(string[] args) { float f1 = 0.09f * 100f; float f2 = 0.09f * 99.999999f; Console.WriteLine(f1 > f2); // Outputs "false" } }</code>
Die Ausgabe ist kontraintuitiv. Warum? Weil 32-Bit-Schwimmer in C# begrenzte Präzision aufweisen (ungefähr 23 signifikante Bits). Die Berechnungen, die 0.09f
Rundungsfehler beinhalten. Während f1
und f2
in der Nähe erscheinen, unterscheiden sich ihre abgerundeten schwebenden Punktdarstellungen geringfügig, wodurch der Vergleich f1 > f2
return false
.
Um diese Probleme zu vermeiden, vermeiden Sie direkte Gleichstellungsprüfungen. Verwenden Sie stattdessen einen toleranzbasierten Vergleich:
<code class="language-csharp">bool AreApproximatelyEqual(float a, float b, float tolerance) { return Math.Abs(a - b) < tolerance; }</code>Diese Funktion prüft, ob die absolute Differenz zwischen zwei Schwimmern unter einem vordefinierten
liegt. Die Auswahl eines geeigneten tolerance
hängt vom Kontext und dem erwarteten Genauigkeitsniveau ab. Für eine höhere Präzision überlegen Sie tolerance
anstelle von double
. Aber auch float
unterliegt ähnliche Einschränkungen, obwohl mit größerer Genauigkeit. double
Das obige ist der detaillierte Inhalt vonWarum führt die Floating-Punkt-Arithmetik in C# beim Vergleich scheinbar gleicher Werte unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!