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.
这篇关于检查双重平等是否安全?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:检查双重平等是否安全?


- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01