[英]C: Rounding floats
你能解释一下这段代码吗:
printf("Value1: %0.1f \n", (float)124/100); // = 1.2
printf("Value1: %0.1f \n", (float)125/100); // = 1.2
printf("Value1: %0.1f \n", (float)126/100); // = 1.3
printf("\n");
printf("Value2: %0.1f \n", (float)134/100); // = 1.3
printf("Value2: %0.1f \n", (float)135/100); // = 1.4
printf("Value2: %0.1f \n", (float)136/100); // = 1.4
为什么数字 125向下舍入为 1.2 而 135向上舍入为 1.4? 例如,它也会发生在数字 105、115、125、155、165 上。
C 标准没有完全指定float
格式或如何执行舍入。 今天大多数 C 实现都使用 IEEE-754 binary32 格式来表示float
。 在这种格式中:
如果您将printf
调用中的%0.1f
更改为%.99g
.99g ,您的 C 实现可能会向您显示这些值。
最常用的舍入规则是舍入到最接近的可表示值,如果出现平局,则舍入到具有更低数字的平局值。 这是几乎总是用于算术运算(尤其是加法、减法、乘法和除法)的规则,因此您的 C 实现可能在计算(float)124/100
等时使用它。
在将数字从内部二进制float
格式转换为字符串中的数字时,也经常使用该规则,例如printf
。 (在这种情况下,该规则的使用频率较低,因为某些转换软件未编写为使用根据此规则始终产生正确结果所需的精度或计算。)您观察到的 output 与此规则的使用一致:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.