检查双重平等是否安全?

我有以下代码:

double x = 0; { ...do stuff ...} if(x == 0){ } 

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

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

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

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

如果您尝试捕获的0是初始化时的原始0设置,则是安全的。 但是,如果你期望从数学运算中得到0,那就不安全了。

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

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

如果你自己设置它并希望看它是否曾经改变过,你可以安全地检查是否相等(比如使用哨兵值)虽然NaN对于像这样的东西更安全

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

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