【发布时间】:2015-05-11 16:32:10
【问题描述】:
我刚看了一篇关于浮点值比较的说明
不应使用 == 或 != 比较浮点值 运营商。 大多数浮点值没有精确的二进制表示,并且有 精度有限。
如果是这样,比较两个浮点值的最佳方法是什么?
【问题讨论】:
-
您能解释一下为什么需要比较它们吗?或者您只是对这些文档感到好奇?
标签: c# .net floating-point comparison
我刚看了一篇关于浮点值比较的说明
不应使用 == 或 != 比较浮点值 运营商。 大多数浮点值没有精确的二进制表示,并且有 精度有限。
如果是这样,比较两个浮点值的最佳方法是什么?
【问题讨论】:
标签: c# .net floating-point comparison
以下扩展方法可能有助于实现 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 更好的名称。
【讨论】:
一般来说,浮点数应该使用类似的结构来比较
if( abs((x1 - x2) < 0.001) )
您引用警告的原因是您可能有两种计算方法,如果您没有舍入误差,它们可能相等,但舍入误差会使它们略有不同。
【讨论】:
abs(x1 - x2) < 0.001 * x1
“最佳方法”取决于您为什么要比较数字的情况。一般来说,如果你想检查两个浮点数是否相等,那你就做错了。
浮点数应该用于表示实际值,在这个词的两个意义上。这个物体和另一个物体的长度一样吗?好吧,它们可能看起来一样长,但如果你有足够好的测量设备,你总能找到不同之处。同样,两个浮点数永远不会相等,除非它们测量的是相同的东西,并且以完全相同的方式处理。除此之外,这只是系统某处的舍入误差。
您可能想要检查它们是否接近(接近某个阈值),正如其他答案所建议的那样,但不相等。
【讨论】: