为什么printf没有正确显示浮动?

时间:2015-06-07 22:29:38

标签: c casting floating-point printf

我希望在所有情况下都显示2.33,但是,出于什么原因,仅在第二种情况下发生了这种情况?

printf("Without cast: %0.2f\n", 7 / 3); // Whitout cast: 0.00
printf("With cast: %0.2f\n", (float) 7 / 3); // With cast: 2.33
float x = 7 / 3;
printf("With var: %0.2f\n", x); // With var: 2.00

我刚刚注意到了float的这种行为。如果我使用整数变量,则不会发生。

1 个答案:

答案 0 :(得分:5)

没有强制转换的

7 / 3是整数除法,得到整数2,因为任何余数都被丢弃,所以它相当于调用printf("%0.2f\n", 2);

现在,为什么打印0而不是2?好吧,你告诉它它是格式字符串中的浮点数(“%0.2 f ”)。所以它将你的整数(0b0 ... 000000000000010)解释为float。并且具有这些位设置的浮点数的计算结果为零,精度为%0.2f

您的编译器应该给您一个警告,告知格式说明符与传递的类型不匹配。 不要忽略编译器警告!

使用强制转换是不同的,因为强制转换具有优先级,因此(float) 7 / 37.0f / 3相同,这是浮点除法。使用变量,你进行了整数除法,最后得到了2,但是这两个被转换为浮点数,因此printf正确地解释了它。