检查双重平等是否安全?

2022-01-09 00:00:00 floating-point java

我有以下代码:

double x = 0;

{ ...do stuff ...}

if(x == 0){

}

我总是被教导不要检查浮点数是否相等.检查它是否等于零有什么不同吗?

I was always taught that you shouldn't check floats for equality. Is checking to see if it is equal to zero any different?

推荐答案

你不应该检查浮点数是否相等的原因是浮点数不是完全精确的——存储中有一些数字不准确,比如那些这延伸到尾数和重复小数太远(请注意,我正在谈论以2为底的重复小数).您可以将这种不精确性视为四舍五入".超出浮点数精度的数字将被截断,实际上是向下舍入.

The reason you shouldn't check floats for equality is that floating point numbers are not perfectly precise -- there's some inaccuracy in storage with some numbers, such as those that extended too far into the mantissa and repeating decimals (note that I'm talking about repeating decimals in base 2). You can think of this imprecision as "rounding down". The digits that extend beyond the precision of the floating-point number are truncated, effectively rounding down.

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

If it has not changed, it will keep that equality. However, if you change it even slightly, you probably should not use equalities, but instead a range like (x < 0.0001 && x > -.0001).

简而言之:只要你不是在很小的级别上玩 x 就可以了.

In short: as long as you're not playing with x at a very small level, it's OK.

相关文章