如何在if语句中比较double类型变量?比较失效问题求助
为什么比较double类型变量时无法得到正确结果?
这是浮点数编程里最常见的“坑”之一——绝对不能直接用==或!=来判断两个double(或float)值是否相等。
问题根源:浮点数的精度限制
计算机用二进制存储浮点数,但很多十进制小数(比如你代码里的0.015)无法被二进制精确表示,只能存储一个无限接近的近似值。当你进行加减运算时,这些微小的误差会被累积保留,导致两个“理论上相等”的值,实际在内存中的二进制表示并不完全一致。直接用==判断时,会因为这些微小差异返回false,和你预期的结果不符。
正确的解决方法:用阈值判断差值
你应该判断两个浮点数的差值的绝对值是否小于一个足够小的阈值(业内通常叫它epsilon,比如1e-9,可以根据你的计算精度需求调整)。只要差值在这个阈值内,就可以认为两个值是“相等”的。
针对你代码里的判断逻辑,把:
if((fabs(s_rel) - K_spiel) == ...)
改成类似这样:
// 用1e-9作为精度阈值,判断差值是否足够小 if(fabs(fabs(s_rel) - K_spiel) < 1e-9) { // 这里写你需要执行的逻辑 }
或者更贴合你代码的逻辑(因为s_rel理论上等于K_spiel),可以简化成:
if(fabs(s_rel - K_spiel) < 1e-9) { // 执行逻辑 }
举个直观的例子
比如你运行这段代码:
#include <stdio.h> #include <math.h> int main() { double a = 0.1 + 0.2; if(a == 0.3) { printf("相等\n"); } else { printf("不相等\n"); printf("a的值是:%.15f\n", a); printf("0.3的值是:%.15f\n", 0.3); } return 0; }
输出会是“不相等”,因为0.1+0.2的结果是0.30000000000000004,和0.3的存储值有微小差异。但如果用if(fabs(a - 0.3) < 1e-9),就会返回true,符合我们的预期。
内容的提问来源于stack exchange,提问作者Mohamed Azzam
相关产品推荐
相关产品推荐

