比较浮点值

时间:2009-10-07 07:28:19

标签: c# .net floating-point comparison

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

  

不能使用==或!=来比较浮点值   运营商。   大多数浮点值没有精确的二进制表示,并且有一个   精度有限。

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

3 个答案:

答案 0 :(得分:7)

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

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;
}

所以现在你可以这样做:

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

只需将IsEqualTo更改为更合适的名称,或者根据需要将默认边距更改为优于double.Epsilon的任何内容。

答案 1 :(得分:3)

通常应使用类似

的构造来比较浮点数
if( abs((x1 - x2) < 0.001) )

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

答案 2 :(得分:2)

“最佳方法”取决于您要比较数字的原因。一般来说,如果您认为要检查2个浮点数是否相等,那么您做错了。

浮点数应该用于表示单词的两种意义上的实际值。该对象的长度是否与其他对象相同?好吧,它们的长度可能相同,但如果你得到一个足够好的测量设备,你总能找到差异。类似地,两个浮点数永远不会相等,除非它们测量相同的东西,并且已经以完全相同的方式处理。除此之外,它只是系统中某处的舍入错误。

你可能想要检查它们是否接近,(接近某个阈值)正如其他答案所暗示的那样,但不相等。