首頁 >後端開發 >C++ >為什麼C#中的浮點比較有時會產生意外的結果?

為什麼C#中的浮點比較有時會產生意外的結果?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-31 04:07:36530瀏覽

Why Do Floating Point Comparisons in C# Sometimes Yield Unexpected Results?

C# 浮點數運算中的精度問題

在 C# 等許多編程語言中,浮點數用於表示小數。然而,由於計算機中浮點數的有限表示方式,這些數字本身就存在精度問題。

考慮以下程序:

<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);
    }
}</code>

此程序輸出 false,這似乎與 0.09 100 應該大於 0.09 99.999999 的直覺相矛盾。

理解精度問題

這種精度問題的原因在於浮點數在內存中的表示方式。這些數字存儲為尾數(小數部分)、指數(基數的冪)和符號的組合。然而,尾數的精度位數是有限的。

在 C# 中,單精度浮點數 (float) 具有 23 位尾數,而雙精度浮點數 (double) 具有 52 位尾數。當尾數無法精確表示給定值時,它將四捨五入到最接近的可表示數字。

在上面的示例中,0.09 100 的精確值是 9.000000190734863,但由於精度有限,它在 32 位 float 表示中四捨五入為 9.0。類似地,0.09 99.999999 四捨五入為 9.0。結果,這兩個值被比較為相等,程序輸出 false。

為了減輕這種精度問題,IEEE 754 浮點運算標準引入了“epsilon”的概念,它表示可以添加到 1.0 而不會改變其值的最小正浮點數。在 C# 中,此值約為 1.4013e-45。

通過將兩個浮點數之間的差與 epsilon 進行比較,可以確定它們在浮點精度範圍內是否有效相等。

以上是為什麼C#中的浮點比較有時會產生意外的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn