Heim >Backend-Entwicklung >C++ >Warum führt die Floating-Punkt-Arithmetik in C# beim Vergleich scheinbar gleicher Werte unerwartete Ergebnisse?

Warum führt die Floating-Punkt-Arithmetik in C# beim Vergleich scheinbar gleicher Werte unerwartete Ergebnisse?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-31 04:12:11825Durchsuche

Why Does Floating-Point Arithmetic in C# Produce Unexpected Results When Comparing Seemingly Equal Values?

C# Floating-Punkt-Arithmetik: Präzisions- und Vergleichsfallfall

Die Gleitkomma-Arithmetik von

C#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.

Dies zeigt eine kritische Einschränkung: Direkte Gleichstellung oder Ungleichheitsvergleiche von Gleitkomma-Zahlen sind unzuverlässig. Minute Unterschiede, die für menschliche Beobachtungen nicht wahrnehmbar sind, kann dazu führen, dass Vergleiche scheitern.

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!

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