比较double类型与0时,直接用==是否正确?为何测试总是输出yes?
关于double类型与0比较的疑问解答
为什么你的代码里d == 0.0总是输出"yes"
你代码中的变量d是直接用精确的0.0字面量赋值的,而double类型可以精确表示0.0——在IEEE 754标准中,0有明确的二进制存储格式,没有精度损失。此时变量d的二进制值和字面量0.0完全一致,所以==比较必然返回true,输出"yes"是完全符合预期的。
直接用if (d == 0)是不是正确写法?
这取决于变量d的来源:
- 如果d是直接赋值为0.0,或是通过无精度损失的操作得到的精确0(比如将另一个精确为0的double变量赋值给它),那么这个写法是完全正确且高效的,不需要额外的误差范围判断。
- 如果d是浮点运算的结果(比如加减乘除、三角函数、平方根等计算得到的值),那么直接用
==比较0就不安全了。因为浮点运算过程中会产生精度误差,原本理论上应该为0的结果,实际存储的可能是一个非常接近0的非零值(比如1e-16),这时候==会返回false,但从业务逻辑来说我们需要把它视为0。这种情况下,应该用**判断绝对值是否小于某个预设的精度阈值(epsilon)**的方式,比如:#include <cmath> // ... if (fabs(d) < 1e-6) { // 1e-6是示例阈值,需根据实际精度需求调整 cout << "yes" << endl; }
补充说明
IEEE 754浮点类型(包括double)能精确表示的数是有限的:除了0之外,还包括2的整数次幂及其组合(比如0.5、0.25、3.0等),但像0.1、0.2这种十进制小数无法用二进制浮点精确存储,所以涉及这类数值的运算容易产生误差。但0.0不存在这个问题,只要是精确赋值的0,就可以安全地用==比较。
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

