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中文網其他相關文章!