问:...函数将 3.55 转换为 3.6,将 0.0499999 转换为 0.0 ...?
答:使用@Kninnug 答案,但保留小数点后一位。
f = round(f * 10) / 10.0;
它会给你,因为3.5
这个数字最初f
不是3.55。没错,您使用文本“3.55”进行了初始化,但您的计算机无法准确表示该数字。 您的系统上没有 (float) 3.55。相反,它的价值约为,因为它是最接近的选择。f
C
f
3.549999952...
如果您仍希望显示f
舍入为 3.6 而不是 3.5,则需要f
稍微提高一点。轻推什么时候它3.549999952...
的值 >= 3.55,什么时候f
是0.04999990016...
(0.0499999 也不能完全表示)相同的轻推使它保持f
< 0.5。
f
我们可以增加并看到变化的最小的是nextafterf(f, g)
. g
是您希望达到的值。
3.549999952... --> 3.550000190...
0.04999990016... --> 0.04999990389...
printf("%.1f\n", nextafterf(f, 2*f));
// prints 3.6 when f is 3.549999952...
// prints 0.0 when f is 0.04999990389...
建议您查看@Oli Charlesworth 答案中的参考资料。