为什么 printf( "%.2f" , (double) 12.555) 返回 12.55?

Why does printf("%.2f", (double) 12.555) return 12.55?

本文关键字:返回 printf 2f 为什么 double      更新时间:2023-10-16

我正在编写一个程序,我必须将小数点后两位四舍五入到第二位。我注意到 printf("%.2f", (double) 12.555) 返回 12.55。但是,printf("%.2f", (float) 12.555) 返回 12.56。谁能解释为什么会这样?

12.555 是一个无法精确表示二进制浮点数的数字。碰巧的是,系统上可以用双

精度浮点表示的最接近 1.2555 的值略小于 1.2555,而在单精度浮点中可表示的最接近 1.2555 的值略大于 1.2555。

假设转换使用的舍入模式是舍入到最接近(并列到偶数),这是IEEE 754标准中的默认设置,那么所描述的输出是预期的。

浮点数和双精度数使用 IEEE 754 表示形式在内部存储。与您的问题相关的部分是,鉴于其表示的限制,浮点数和双精度数都存储最接近十进制数。粗略地说,这些限制与将原始数字的小数部分转换为具有有限位数的二进制数有关。

事实证明,最接近 12.555 的浮点数实际上是 12.55500030517578125,而最接近 12.555

的双精度是 12.5549999999999999715782905696。请注意双精度如何提供更高的准确性,但误差为负数。

在这一点上,现在可能很明显为什么 round 函数在浮点数时上升而对双精度函数向下 - 它们都舍入到最接近底层表示的十进制数。