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); // Outputs "false" } }</code>
輸出是違反直覺的。 為什麼?因為在C#中的32位浮子的精度有限(約23位顯著)。 涉及0.09f
的計算引入了舍入錯誤。 而f1
和f2
出現近距離,而它們的圓形浮點表示略有不同,使得比較f1 > f2
返回false
。
這突出了一個關鍵限制:浮點數的直接平等或不平等比較是不可靠的。 人類觀察無法察覺的微小差異會導致比較失敗。
> 為了避免這些問題,請避免進行直接的平等檢查。相反,使用基於公差的比較:
<code class="language-csharp">bool AreApproximatelyEqual(float a, float b, float tolerance) { return Math.Abs(a - b) < tolerance; }</code>
。 選擇適當的tolerance
取決於上下文和預期的精度水平。 為了獲得更高的精度,請考慮使用tolerance
而不是double
。 但是,即使float
也受到類似的局限性,儘管精度更高。
以上是在比較看似相等的值時,為什麼C#中的浮點算術會產生意外的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!