有人可以解释为什么 Cprintf
在第二种情况下四舍五入吗?
printf("%.03f", 79.2025); /* "79.203" */
printf("%.03f", 22.7565); /* "22.756" */
OP 的帖子提示:
printf("%.03f", 79.2025); /* "79.203" */
printf("%.03f", 22.7565); /* "22.756" */
为什么一个值向上取整,另一个向下取整?
数字 like79.2025
和22.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] 删除。
我来说两句