有人可以解释为什么C printf在第二种情况下会逐渐减少吗?
printf("%.03f", 79.2025); /* "79.203" */
printf("%.03f", 22.7565); /* "22.756" */
Run Code Online (Sandbox Code Playgroud)
OP的帖子提示:
printf("%.03f", 79.2025); /* "79.203" */
printf("%.03f", 22.7565); /* "22.756" */
Run Code Online (Sandbox Code Playgroud)
为什么一个值四舍五入而另一个值下降?
数字79.2025和您的系统上的数字22.7565不完全一致double.而是编码附近的值.
2个可能的确切 doubles值是
79.2025000000000005684341886080801486968994140625
22.756499999999999062083588796667754650115966796875
Run Code Online (Sandbox Code Playgroud)
这是由于使用二进制浮点编码.大多数系统使用二进制浮点数,尽管C确实允许基数:16,10和其他2的幂.(我从未使用过"其他2次幂"系统.)
将这两个值打印到最接近的0.001作为printf("%.03f"...指示如下,这与OP的结果相匹配.
79.203 // 79.20250000000000056... rounds up as 50000000000056... > 50000000000000...
22.756 // 22.75649999999999906... rounds down as 49999999999906... < 50000000000000...
Run Code Online (Sandbox Code Playgroud)
以下也很有趣.1.0625和1.1875都可以完全编码double.然而,由于通常的"圆形关系甚至"规则,一个通常会围绕而另一个向下舍入.根据不同的情况,您的输出可能会有所不同,但以下输出很常见.
printf("%.03f", 1.0625); /* "1.062" */
printf("%.03f", 1.1875); /* "1.188" */
Run Code Online (Sandbox Code Playgroud)
使用不同精度的二进制浮点类型并没有改变根本问题:FP在代码中x.xxx5的形式分配十进制值很少有匹配的精确值.其中约50%将超过x.xxx5而另一个更少.