将整数乘以浮点字面值 - 是否需要"F"?

Ada*_*m S 9 c

这是:

int i = 100 * 0.6;
Run Code Online (Sandbox Code Playgroud)

不正确吗?

int i = 100 * (0.6F);
Run Code Online (Sandbox Code Playgroud)

我为这么简单的问题道歉,但我没有记住数据类型促销的所有规则,我不确定如何验证这一点.

Oli*_*rth 14

它可以有所作为.对于例如:

int i = (1 << 24) + 3;

printf("%d\n", (int)(i * 0.6));    // 10066331
printf("%d\n", (int)(i * 0.6f));   // 10066332
Run Code Online (Sandbox Code Playgroud)

原因是第一个的计算是双精度的,后者是单精度的.单精度不能表示大于的所有整数1 << 24.

另一个例子(@EricPostpischil在下面的评论中提供):

int i = 100;

printf("%d\n", (int)(i * 0.29));    // 28
printf("%d\n", (int)(i * 0.29f));   // 29
Run Code Online (Sandbox Code Playgroud)

原因在于,双精度情况下的中间结果略低于29,因此被截断为28.

所以我建议允许双精度(即省略f/ F)(然后使用round()而不是依赖于隐式截断),除非你有充分的理由不这样做.


lda*_*v1s 5

F不会在这个特殊的情况下需要.它所做的就是将常量指定为类型float而不是类型double.