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)) ... |
如果需要,只需将
一般来说,浮点数应该使用类似于
1 | if( abs((x1 - x2) < 0.001) ) |
您引用警告的原因是,您可能有两种计算方法,如果没有舍入误差,它们可能相等,但舍入误差使它们略有不同。
"最佳方法"取决于你为什么要比较数字的情况。一般来说,如果你想检查两个浮点数是否相等,那你就错了。
浮点数应该被用来表示实数,在两个词的意义上。这个对象和另一个对象的长度相同吗?嗯,它们的长度可能是一样的,但是如果你有足够好的测量装置,你总能发现不同之处。同样,两个浮点数永远不会相等,除非它们测量的是相同的东西,并且以完全相同的方式进行处理。除此之外,它只是系统中某个地方的舍入误差。
您可能想检查它们是否像其他答案所建议的那样接近(接近某个阈值),但不等于。