You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用float类型变量时0.1+0.2==0.3返回true?

为什么float变量的0.1+0.2==0.3返回true?

这个问题的核心在于浮点数的精度差异以及C++中字面量的默认类型,我来给你拆解清楚:

  • 默认小数字面量是double类型:在C++里,像0.1、0.2、0.3这类小数字面量,默认会被当作double(双精度浮点数)处理。double的精度很高(约15-17位有效数字),但0.1和0.2在二进制中是无限循环的小数,即使是double也只能存储它们的近似值。当你直接计算0.1 + 0.2时,这个结果和0.3的double近似值之间存在极其微小的差异,所以直接判断0.1 + 0.2 == 0.3会返回false。

  • float的精度截断抹平了误差:当你把这些double字面量赋值给float变量时,情况就变了。float的存储位远少于double(只有约6-7位有效数字),它会对输入的double值进行精度截断,只保留最接近的能被float表示的近似值。这时候,float版本的0.1和0.2相加后的结果,刚好等于float版本的0.3的近似值——原本double里的微小误差在转成float时被“吃掉”了,最终三者的近似值刚好相等,所以判断返回true。

  • 关键注意事项:无论是float还是double,都绝对不要直接用==判断浮点数相等,因为浮点数的存储本质是对十进制数的二进制近似。正确的做法是判断两个值的差值是否小于一个极小的阈值(通常称为epsilon),比如:

    #include <cmath> // 需要包含cmath头文件来使用fabs函数
    
    float x, y, z;
    x = 0.1;
    y = 0.2;
    z = 0.3;
    if (fabs(x + y - z) < 1e-6) { // 1e-6是适合float的阈值,double可以用1e-12
        cout << "True" << endl;
    } else {
        cout << "False" << endl;
    }
    

内容的提问来源于stack exchange,提问作者Adam Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:08:46