不应该使用
==
来比较实数,每个 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;
}
不应该使用 == 来比较实数,每个 C# 开发人员都知道这一点。
我假设您的意思是,由于浮点表示的固有问题,浮点值通常应该与一定的容差进行比较(本文对此进行了总结:浮点数学是否已损坏?)。
那么为什么框架中的 Double.CompareTo 方法要以这种方式实现来检查相等性?
实际上没有其他实现通常有意义,因为比较值的容差取决于您的上下文。没有一种容差适合所有情况。
此外,在某些情况下,使用
==
来比较浮点值确实有意义:double d1 = ...; // initialized with some non-zero value
double d2 = 0;
if (<some_condition>) {
d2 = d1;
}
然后,如果您想检查
d2
是否已分配给 d1
,则使用 ==
是完全有效的。
底线:
您应该与适合您的浮点计算环境的一些容差进行比较,而不是使用
CompareTo
(除非您遇到上述分配的情况)。