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

C++ 为什么printf(“.2f%,(double)12.555)返回12.55?,c++,floating-point,double,C++,Floating Point,Double,我在写一个程序,我必须把双精度四舍五入到小数点后第二位。我注意到printf(“%.2f”,(双)12.555)返回12.55。但是,printf(“%.2f”,(float)12.555)返回12.56。有人能解释为什么会发生这种情况吗?12.555是一个不能用二进制浮点精确表示的数字。在系统上,可以用双精度浮点表示的最接近1.2555的值略小于1.2555,而可以用单精度浮点表示的最接近1.2555的值略大于1.2555 假设转换使用的舍入模式是四舍五入到最近(与偶数相等),这是IEEE 7

我在写一个程序,我必须把双精度四舍五入到小数点后第二位。我注意到printf(“%.2f”,(双)12.555)返回12.55。但是,printf(“%.2f”,(float)12.555)返回12.56。有人能解释为什么会发生这种情况吗?

12.555是一个不能用二进制浮点精确表示的数字。在系统上,可以用双精度浮点表示的最接近1.2555的值略小于1.2555,而可以用单精度浮点表示的最接近1.2555的值略大于1.2555


假设转换使用的舍入模式是四舍五入到最近(与偶数相等),这是IEEE 754标准中的默认值,则所描述的输出是预期的。

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

事实证明,最接近12.555的浮动实际上是12.55500030517578125,而最接近12.555的双精度浮动是12.55499999999715782905696。请注意double如何提供更高的精度,但误差为负值


此时,很明显,为什么舍入函数的浮点值上升,而双精度值下降-它们都舍入到最接近基础表示形式的十进制数。

打印出浮点值和双精度值(6+位数),然后查看结果。我假设不精确的值被正确舍入。:)