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

为何float类型变量a赋值1.2后,用==判断不等于1.2?

浮点型变量比较的常见问题解答

问题根源

  • 代码里的1.2默认是double类型的浮点常量,而a是float类型。float的精度只有约6-7位有效数字,1.2无法被二进制浮点精确表示,所以a存储的是1.2的近似值;而double精度更高,存储的1.2近似值和float的不一样,直接用==比较时,两个近似值不相等,就走到了else分支。
  • 你用fixed<<setprecision(1)打印时,只是把近似值四舍五入到一位小数显示,看起来是1.2,但实际存储的数值和double的1.2有微小差异。

解决办法

  1. 使用float字面量
    在数值后面加f,让常量和变量都是float类型,这样存储的近似值一致,比较就能匹配:
#include<iostream>
#include<iomanip>
using namespace std;

int main ()
{
    float a = 1.2f;
    cout<<fixed<<setprecision(1)<<a<<endl;
    
    if (a == 1.2f)
        cout<<"\n a is 1.2";
    else
        cout<<"\n a is not 1.2";
    return 0;
}
  1. 改用double类型变量
    把float a改成double a,变量和常量都用精度更高的double类型,存储的近似值一致,比较也会成立:
#include<iostream>
#include<iomanip>
using namespace std;

int main ()
{
    double a = 1.2;
    cout<<fixed<<setprecision(1)<<a<<endl;
    
    if (a == 1.2)
        cout<<"\n a is 1.2";
    else
        cout<<"\n a is not 1.2";
    return 0;
}
  1. 精度范围判断(开发推荐)
    浮点型本质是近似存储,直接用==比较不安全,应该判断两个值的差是否小于一个极小阈值(比如1e-6):
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;

int main ()
{
    float a = 1.2;
    cout<<fixed<<setprecision(1)<<a<<endl;
    
    if (fabs(a - 1.2) < 1e-6)
        cout<<"\n a is approximately 1.2";
    else
        cout<<"\n a is not 1.2";
    return 0;
}

内容的提问来源于stack exchange,提问作者Abdul Moeez Sultan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:25:23