问:...函数将 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。相反,它的价值约为,因为它是最接近的选择。fCf3.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 答案中的参考资料。