当我开始使用相等运算符比较两个浮点值时,我使用的代码审查工具抱怨如下。正确的方法是什么,怎么做?有没有我可以重用的助手函数(commons-*)?
描述
无法使用等于(==)运算符比较浮点值
说明
由于舍入误差,使用相等(==)或不等式(!=)运算符比较浮点值并不总是准确的。
Recommendation
比较这两个浮点值,看看它们的值是否接近。
float a;
float b;
if(a==b)
{
..
}发布于 2011-07-27 06:12:46
用于比较两个浮点数的IBM has a recommendation,使用除法而不是减法-这使得选择适用于所有输入范围的epsilon变得更容易。
if (abs(a/b - 1) < epsilon)至于epsilon的值,我会使用this Wikipedia table中给出的5.96e-08,或者可能是这个值的2倍。
发布于 2011-07-27 05:51:19
它希望您将它们进行比较,使其在所需的精确度内。例如,如果您要求浮点数的前4位十进制数相等,则可以使用:
if(-0.00001 <= a-b && a-b <= 0.00001)
{
..
}或者:
if(Math.abs(a-b) < 0.00001){ ... }将所需精度与两个数字的差值相加,并将其与所需精度的两倍进行比较。
您认为更具可读性的内容。我自己更喜欢第一个,因为它清楚地显示了你在两边都允许的精确度。
a = 5.43421和b = 5.434205将通过比较
发布于 2011-07-27 05:49:33
private static final float EPSILON = <very small positive number>;
if (Math.abs(a-b) < EPSILON)
...由于浮点数为您提供了可变但无法控制的精度(即,您不能在使用double和float之间进行选择时设置精度),因此您必须选择自己的固定精度进行比较。
请注意,这不再是真正的等价运算符,因为它不是可传递的。你可以很容易地得到a等于b,b等于c,但a不等于c。
编辑:还要注意,如果a是负数,而b是一个非常大的正数,则减法可能会溢出,结果将是负无穷大,但测试仍将工作,因为负无穷大的绝对值是正无穷大,这将大于EPSILON__。
https://stackoverflow.com/questions/6837007
复制相似问题