为何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有微小差异。
解决办法
- 使用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; }
- 改用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; }
- 精度范围判断(开发推荐)
浮点型本质是近似存储,直接用==比较不安全,应该判断两个值的差是否小于一个极小阈值(比如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
相关产品推荐
相关产品推荐

