这是:
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()而不是依赖于隐式截断),除非你有充分的理由不这样做.