我试图使用printf
打印一些浮点数。
例如:
int main()
{
printf("%.1f",76.75);
return 0;
}
输出:76.8
我对结果有一些问题。
首先,为什么它没有打印出76.7
?
其次,它是如何四舍五入的?
我试图使用printf
打印一些浮点数。
例如:
int main()
{
printf("%.1f",76.75);
return 0;
}
输出:76.8
我对结果有一些问题。
首先,为什么它没有打印出76.7
?
其次,它是如何四舍五入的?
fprintf
f
,F
将浮点数 double
格式化为十进制小数表示形式,格式为 [−]ddd.ddd
,小数点后的数字位数等于精度规范。如果省略了精度,则默认为6;如果精度为零并且未指定 #
标志,则不会出现小数点字符。如果出现小数点,则小数点之前至少出现一个数字。该值将四舍五入到适当的数字位数。
76.75
恰好表示数字7675/100,它恰好位于76.7和76.8之间的中心位置。在应用“最接近偶数”舍入模式时,后者被认为是“偶数”。这可能是您的编译平台选择生成此十进制表示形式作为浮点数76.75
的十进制转换的原因。System.out.printf("%.2f", 0.745);
输出0.75
。 - tmyklebu0.745
不是精确的。或者这可能是“Java舍入”的一个很好的例子,因为Java使用 %.53f
打印它时会打印出精确值。因此,“Java舍入”实际上似乎是“打印足够多的小数位以使值在原始浮点类型中无歧义,然后应用小学的舍入规则”。0.745
小于 745/1000 并被舍入为 0.75。太棒了!无论如何,如果您不想讨论为什么Java <脏话蜂鸣器>,那么一个更好的例子是 0.25
。 - Pascal Cuoq0.745
的原因。0.745
-the-double小于0.745
-the-rational,所以使用"%.2f"
打印时,无论采用哪种最近舍入方式,它都应该向下舍入。但是Java使用"%.2f"
将其向上舍入。 - tmyklebu首先,为什么他没有打印出76.7?
因为语言规范规定低位数字将被四舍五入。
他如何对数字进行舍入?(一些代码会有帮助)
这因实现而异。根据文档所述,
低位数字应以实现定义的方式进行舍入(已添加强调)。
37.975
不转换为 37.98?”这个问题是“为什么76.75
转换为 76.8?”它们是对称的相反的问题。此外,那里的答案归咎于在编译37.975
期间发生的 十进制到浮点数 转换中的四舍五入。正确的答案应该解释这是 浮点数到十进制 转换的正常舍入行为,对于一个恰好处于两个十进制表示之间的值。 - Pascal Cuoq