繁体   English   中英

为什么printf(“%。2f”,(double)12.555)返回12.55?

[英]Why does printf(“%.2f”, (double) 12.555) return 12.55?

我正在编写一个程序,我不得不将其加倍到小数点后第二位。 我注意到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.554999999999999715782905696。 注意double如何提供更高的准确性,但错误是负面的。

在这一点上,现在可能很明显为什么圆函数向上浮动而向下为双 - 它们都是四舍五入到底层表示的最接近的十进制数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM