使用println和printf进行不同的舍入

Vic*_*uss 10 java precision double

0.8999999999999999由于精度损失,下面的第一行将打印,这很清楚.但第二行会打印0.9,我只是不明白为什么.这个计算不应该有同样的问题吗?

System.out.println(2.00-1.10);
System.out.printf("%f",2.00-1.10);
Run Code Online (Sandbox Code Playgroud)

Mas*_*dul 5

此输出是由于round half up采用浮动格式而导致的%f。如果您阅读文档,那么您将获得

如果未指定精度,则默认值为6。如果精度小于分别由Float.toString(float)或Double.toString(double)返回的字符串中小数点后出现的位数,然后将使用舍入上舍入算法对值进行舍入


Rah*_*thi 5

我认为您缺少使用System.out.printf()的功能,如果您未显式设置格式宽度,则C中的printf的默认行为(如果未明确指定,则为6个小数位)

因此,如果您不指定任何数字,%f则默认情况下它将仅打印1个字符。但是,如果要更改小数点后的数字,则需要像%.2f这样指定它,这会将数字打印到2个小数位。

所以这类似于写像

System.out.printf("%f",2.00-1.10);
Run Code Online (Sandbox Code Playgroud)

要么

System.out.printf("%.1f",2.00-1.10);
Run Code Online (Sandbox Code Playgroud)

正如float格式说明符的一般语法是:

%[flags][width][.precision][argsize]typechar 
Run Code Online (Sandbox Code Playgroud)

附带说明:-

Java中也有一个用于此的格式化程序类

printf样式的格式字符串的解释器。此类提供对布局调整和对齐,数字,字符串和日期/时间数据的通用格式以及特定于语言环境的输出的支持。支持常见的Java类型,例如byte,BigDecimal和Calendar。通过Formattable接口提供了针对任意用户类型的有限格式定制。

Oracle文档

如果未指定精度,则默认值为6。如果精度小于分别由Float.toString(float)或Double.toString(double)返回的字符串中小数点后出现的位数,然后将使用舍入上舍入算法对值进行舍入。