为什么 Double.CompareTo() 内部使用“==”?

问题描述 投票:0回答:1

不应该使用

==
来比较实数,每个 C# 开发人员都知道这一点。那么为什么框架中的
Double.CompareTo
方法以这种方式实现来检查相等性?

public int CompareTo(double value)
{
    if (m_value < value) return -1;
    if (m_value > value) return 1;
    if (m_value == value) return 0; // <= here

    // At least one of the values is NaN.
    if (IsNaN(m_value))
        return IsNaN(value) ? 0 : -1;
    else
        return 1;
}

来源:https://github.com/dotnet/runtime/blob/1d1bf92fcf43aa6981804dc53c5174445069c9e4/src/libraries/System.Private.CoreLib/src/System/Double.cs#L263C13-L271C26

c# .net
1个回答
0
投票

不应该使用 == 来比较实数,每个 C# 开发人员都知道这一点。

我假设您的意思是,由于浮点表示的固有问题,浮点值通常应该与一定的容差进行比较(本文对此进行了总结:浮点数学是否已损坏?)。

那么为什么框架中的 Double.CompareTo 方法要以这种方式实现来检查相等性?

实际上没有其他实现通常有意义,因为比较值的容差取决于您的上下文。没有一种容差适合所有情况。

此外,在某些情况下,使用

==
来比较浮点值确实有意义:
例如。如果你有:

double d1 = ...;      // initialized with some non-zero value
double d2 = 0;
if (<some_condition>) {
    d2 = d1;
}

然后,如果您想检查

d2
是否已分配给
d1
,则使用
==
是完全有效的。

底线:
您应该与适合您的浮点计算环境的一些容差进行比较,而不是使用

CompareTo
(除非您遇到上述分配的情况)。

© www.soinside.com 2019 - 2024. All rights reserved.