检查双重平等是否安全?

时间:2011-08-24 19:11:42

标签: java floating-point

我有以下代码:

double x = 0;

{ ...do stuff ...}

if(x == 0){

}

我总是被告知你不应该检查花车的平等性。是否检查它是否等于零?

5 个答案:

答案 0 :(得分:30)

你不应该检查浮点数是否相等的原因是浮点数不是很精确 - 存储中存在一些不准确的数字,例如那些延伸到尾数太远且重复小数的数据(注意我我在谈论在基数2中重复小数。您可以将这种不精确视为“四舍五入”。超出浮点数精度的数字将被截断,有效地向下舍入。

如果没有改变,它将保持平等。但是,如果你稍微改变它,你可能不应该使用等号,而是使用(x < 0.0001 && x > -.0001)之类的范围。

简而言之:只要你没有在非常小的水平上玩x,就可以了。

答案 1 :(得分:17)

如果您尝试捕获的0是初始化时的原始0设置,则是安全的。但是,如果您期望数学运算为0,则不安全。

答案 2 :(得分:5)

你仍然不应该检查它是否等于零。只需检查它是否接近零。

private final static double EPSILON = 0.00001;
if (x + EPSILON > 0 && x - EPSILON < 0){
...
}

答案 3 :(得分:4)

如果您自己设置并希望查看它是否有所改变,您可以安全地检查是否相等(例如使用哨兵值)虽然NaN对于类似的东西更安全

float x=Float.NaN;
{
   //some code that may or may not set x
}
if(Float.isNaN(x))//it never got set

答案 4 :(得分:2)

double有正负零。正零和负零之间的==返回false。此外,两个NaN之间的==返回false。