printf'ing 浮动时的舍入问题

尼古拉斯

有人可以解释为什么 Cprintf在第二种情况下四舍五入吗?

printf("%.03f", 79.2025); /* "79.203" */
printf("%.03f", 22.7565); /* "22.756" */
chux - 恢复莫妮卡

OP 的帖子提示:

printf("%.03f", 79.2025); /* "79.203" */
printf("%.03f", 22.7565); /* "22.756" */

为什么一个值向上取整,另一个向下取整?


数字 like79.202522.7565不能像double在您的系统上那样完全表示而是对附近的值进行编码。

2个可能的确切 doubles值是

79.2025000000000005684341886080801486968994140625
22.756499999999999062083588796667754650115966796875

这是由于使用了二进制浮点编码。大多数系统使用二进制浮点数,尽管 C 确实允许基数:16、10 和其他 2 的幂。(我从未研究过“其他 2 的幂”系统。)


按照printf("%.03f"...下面的指示将这 2 个值打印到最接近的 0.001 ,这与 OP 的结果相匹配。

79.203  // 79.20250000000000056... rounds up   as 50000000000056... > 50000000000000...
22.756  // 22.75649999999999906... rounds down as 49999999999906... < 50000000000000...

下面的也很有趣。1.0625 和 1.1875 都可以完全编码为double. 然而,考虑到通常的“与偶数关系”规则,一个通常向上取整,另一个向下取整。根据不同的情况,您的输出可能会有所不同,但以下输出是常见的。

printf("%.03f", 1.0625); /* "1.062" */
printf("%.03f", 1.1875); /* "1.188" */

使用不同精度二进制浮点类型并没有改变根本问题:FP在代码分配在x.xxx5形式的十进制值很少有匹配的精确值。其中大约 50% 将超过 x.xxx5,其他更少。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章