首頁 >後端開發 >C++ >如何在 C# 中可靠地比較浮點數?

如何在 C# 中可靠地比較浮點數?

Linda Hamilton
Linda Hamilton原創
2025-01-23 10:56:10758瀏覽

How to Reliably Compare Floating-Point Numbers in C#?

C# 浮點數比較函數

在 C# 中,由於浮點數固有的精確度限制,浮點數的比較可能會帶來挑戰。為了解決這個問題,請考慮實作自訂比較函數。

IsEqual 函數

為浮點值編寫通用的 IsEqual 函數可能具有挑戰性。一種常見的方法是使用容差閾值,即 epsilon。例如:

<code class="language-csharp">public static bool NearlyEqual(double a, double b, double epsilon)
{
    const double MinNormal = 2.2250738585072014E-308d;
    double absA = Math.Abs(a);
    double absB = Math.Abs(b);
    double diff = Math.Abs(a - b);

    // 处理特殊情况(例如,无穷大)
    if (a.Equals(b))
        return true;

    // 考虑 a 或 b 接近零的情况
    if (a == 0 || b == 0 || absA + absB < MinNormal)
        return diff < epsilon;

    // 使用相对误差
    return diff / (absA + absB) < epsilon;
}</code>

IsGreater 和 IsLess 函數

實作 IsGreater 和 IsLess 函數的方法類似:

<code class="language-csharp">public static bool IsGreater(double a, double b, double epsilon)
{
    // 处理特殊情况
    if (a.CompareTo(b) > 0)
        return true;
    if (a.CompareTo(b) == 0)
        return false;

    // 对非零情况使用相对误差
    double diff = a - b;
    double absA = Math.Abs(a);
    double absB = Math.Abs(b);
    return diff / (absA + absB) > epsilon;
}

public static bool IsLess(double a, double b, double epsilon)
{
    // IsGreater 的反向操作
    return IsGreater(b, a, epsilon);
}</code>

這些函數提供了在 C# 中比較浮點值的有用方法,同時考慮了其固有的精度限制。

以上是如何在 C# 中可靠地比較浮點數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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