我有以下代码:
double x = 0;
{ ...do stuff ...}
if(x == 0){
}
我总是被告知你不应该检查花车的平等性。是否检查它是否等于零?
答案 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。