首頁 > 後端開發 > C++ > 在比較看似相等的值時,為什麼C#中的浮點算術會產生意外的結果?

在比較看似相等的值時,為什麼C#中的浮點算術會產生意外的結果?

Patricia Arquette
發布: 2025-01-31 04:12:11
原創
863 人瀏覽過

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

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的計算引入了舍入錯誤。 而f1f2出現近距離,而它們的圓形浮點表示略有不同,使得比較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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板