出于什么原因 printf 不能正确显示浮点数?

For what reason printf does not correctly display the float?

我希望在所有情况下都显示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

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

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

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

您的编译器应该已经警告您格式说明符与传递的类型不匹配。 不要忽略编译器警告!

与cast不同,因为cast优先,所以(float) 7 / 37.0f / 3一样,都是浮点除法。对于一个变量,你进行了整数除法,所以最后得到了 2,但是这两个被转换成了一个浮点数,所以 printf 正确地解释了它。