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

时间:2013-11-22 09:26:04

标签: java double precision

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

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

3 个答案:

答案 0 :(得分:4)

此输出是由于浮动格式round half up的{​​{1}}操作的原因。如果你通过docs,那么你将获得

  

如果未指定精度,则默认值为6.如果   精度小于之后出现的位数    Float.toString(float)或返回的字符串中的小数点   Double.toString(double)分别为,然后该值将被舍入   使用圆形半升算法

答案 1 :(得分:4)

我认为你缺少使用System.out.printf()的东西,如果你没有明确的格式化宽度,那么printf在C中的默认行为(如果没有明确指定则为6位小数)

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

所以它类似于写作

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

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

由于float的格式说明符的一般语法是:

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

旁注: -

此外,Java中还有一个formatter class

  

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

来自Oracle Docs

  

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

答案 2 :(得分:4)

据我说,格式%f打印1个字符。 它打印0.9的事实是标准的数学舍入行为