关于c#:比较浮点值

Comparing floating point values

我刚刚读了一篇关于浮点值比较的声明

Floating point values shall not be compared using either the == or !=
operators.
Most floating point values have no exact binary representation and have a
limited precision.

如果是,比较两个浮点值的最佳方法是什么?


以下扩展方法可能有助于实施Kevin的建议:

1
2
3
4
5
6
7
8
9
public static bool IsEqualTo(this double a, double b, double margin)
{
    return Math.Abs(a - b) < margin;
}

public static bool IsEqualTo(this double a, double b)
{
    return Math.Abs(a - b) < double.Epsilon;
}

现在你可以做:

1
2
if(x1.IsEqualTo(x2)) ...
if(x1.IsEqualTo(x2, 0.01)) ...

如果需要,只需将IsEqualTo更改为更合适的名称,或者将默认保证金更改为任何优于double.Epsilon的值。


一般来说,浮点数应该使用类似于

1
if( abs((x1 - x2) < 0.001) )

您引用警告的原因是,您可能有两种计算方法,如果没有舍入误差,它们可能相等,但舍入误差使它们略有不同。


"最佳方法"取决于你为什么要比较数字的情况。一般来说,如果你想检查两个浮点数是否相等,那你就错了。

浮点数应该被用来表示实数,在两个词的意义上。这个对象和另一个对象的长度相同吗?嗯,它们的长度可能是一样的,但是如果你有足够好的测量装置,你总能发现不同之处。同样,两个浮点数永远不会相等,除非它们测量的是相同的东西,并且以完全相同的方式进行处理。除此之外,它只是系统中某个地方的舍入误差。

您可能想检查它们是否像其他答案所建议的那样接近(接近某个阈值),但不等于。