Is checking a double for equality ever safe?(检查双重平等是否安全?)
问题描述
我有以下代码:
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.
这篇关于检查双重平等是否安全?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:检查双重平等是否安全?
基础教程推荐
- 验证是否调用了所有 getter 方法 2022-01-01
- Java Swing计时器未清除 2022-01-01
- 大摇大摆的枚举 2022-01-01
- Java 实例变量在两个语句中声明和初始化 2022-01-01
- 不推荐使用 Api 注释的描述 2022-01-01
- 从 python 访问 JVM 2022-01-01
- 在 Java 中创建日期的正确方法是什么? 2022-01-01
- 多个组件的复杂布局 2022-01-01
- 如何在 Spring @Value 注解中正确指定默认值? 2022-01-01
- 如何在 JFrame 中覆盖 windowsClosing 事件 2022-01-01
