为何printf打印变量中的浮点数结果与预期不符?
问题分析与解答
先看你给出的代码:
int main(void) { double b = 11/2; double a = 2; printf("%lf\n", a + b); printf("%lf\n", b); }
输出结果是7.000000和5.000000,而非预期的7.500000和5.500000,核心原因是C语言的整数除法规则:
- 当两个操作数都是整数时,C语言会执行整数除法,直接截断小数部分,只保留整数商。这里
11和2都是int类型,所以11/2的计算结果是整数5,而不是浮点数5.5。 - 之后把整数
5赋值给double类型的变量b,会自动做类型转换,把5转换成5.0,所以b的值是5.0,而非5.5。 - 后续计算
a + b就是2.0 + 5.0 = 7.0,打印出来自然是7.000000和5.000000。
而你直接传递5.5给printf能得到正确结果,是因为5.5本身就是浮点数,不存在整数截断的问题。
解决方法
如果要得到浮点除法的结果,只需要把其中一个操作数改为浮点类型,让编译器执行浮点除法:
// 两种写法都可以 double b = 11.0 / 2; // 或者 double b = 11 / 2.0;
这样11.0/2会按照浮点规则计算,得到5.5,赋值给b后就是5.5,此时a + b的结果就是7.5,打印出来就符合你的预期了。
内容的提问来源于stack exchange,提问作者Guilherme Cintra
相关产品推荐
相关产品推荐

