为何这段C程序输出Information Technology?新手技术求助
你的C程序输出不符合预期的原因
问题出在浮点数的精度存储特性上,核心两点:
类型不匹配导致的精度差异
你定义的float x=3.14是单精度浮点数,但if(x == 3.14)里的3.14默认是双精度double类型。double的精度比float高,存储的3.14近似值更接近真实值,而float的3.14是低精度的近似值,两者实际存储的二进制数值并不完全相等,所以==判断结果为假,执行else分支输出Information Technology。浮点数本身无法精确表示3.14
3.14是十进制小数,但二进制浮点数(不管float还是double)无法精确表示这个数,只能存储近似值。直接用==比较浮点数几乎都是不可靠的,因为哪怕是同一个数值,不同精度的存储结果也会有细微差异。
解决办法
- 方法一:让常量和变量类型一致
把判断里的3.14改成3.14f(明确声明为float类型),这样两边的近似值一致,判断会成立:
#include<stdio.h> int main() // 标准C规范中main函数应返回int类型,不建议用void { float x=3.14; if (x == 3.14f) printf("Computers Science"); else printf("Information Technology"); return 0; }
- 方法二:用精度范围比较(更通用)
判断两个浮点数的差值是否小于一个极小的阈值(比如1e-6,即0.000001),只要差值在这个范围内,就认为两者相等:
#include<stdio.h> #include<math.h> // 使用fabs函数需要包含此头文件 int main() { float x=3.14; if (fabs(x - 3.14) < 1e-6) printf("Computers Science"); else printf("Information Technology"); return 0; }
内容的提问来源于stack exchange,提问作者x_x σɳιx x_x
相关产品推荐
相关产品推荐

