println和printf的四舍五入方式不同

10

下面的第一行将打印0.8999999999999999,这是因为精度丢失导致的,这很清楚。但第二行将打印0.9,我不明白为什么。这个计算不应该有同样的问题吗?

System.out.println(2.00-1.10);
System.out.printf("%f",2.00-1.10);

有同样的问题,但是由于低精度输出而被隐藏了。 - Patricia Shanahan
3个回答

5
我认为在使用System.out.printf()时您可能会忽略了一些东西。如果您没有明确指定格式宽度,那么C中printf的默认行为是保留6个小数位(如果没有明确指定)。因此,如果您不指定任何数字到%f,那么默认情况下它只会打印1个字符。但是,如果您想改变小数点后的数字,则需要像%.2f这样指定,这将打印出2位小数的数字。所以这与写作类似:
System.out.printf("%f",2.00-1.10);

或者
System.out.printf("%.1f",2.00-1.10);

浮点数格式说明符的通用语法如下:

%[flags][width][.precision][argsize]typechar 

顺带一提:

Java中也有一个格式化类可以实现这个功能。

这个解释器用于printf样式的格式字符串。该类支持布局对齐和调整,数字、字符串和日期/时间数据的常见格式,以及特定于区域设置的输出。支持byte、BigDecimal和Calendar等常见Java类型。通过Formattable接口,提供了有限的任意用户类型的格式自定义。

来源于Oracle Docs

如果未指定精度,则默认值为6。如果精度小于Float.toString(float)或Double.toString(double)返回的字符串中小数点后出现的数字,则使用“四舍五入”算法进行取舍。


5
这个输出是由浮点格式%f的"四舍五入"操作引起的。如果你查看文档,你会得到以下信息:
如果没有指定精度,那么默认值为6。如果精度小于使用返回的字符串中小数点后出现的数字的数量,则使用"四舍五入"算法进行舍入。

3

根据我的理解,格式 %f 只输出1个字符。它输出0.9是标准数学四舍五入的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接