Java println和printf的不同舍入

Java println和printf的不同舍入,java,double,precision,Java,Double,Precision,由于精度损失,下面的第一行将打印0.899999999999,这一点很清楚。但是第二行将打印0.9,我不明白为什么。这个计算不应该有同样的问题吗 System.out.println(2.00-1.10); System.out.printf("%f",2.00-1.10); 此输出是由于浮动格式%f的对半取整操作造成的。如果你通过考试,你会得到更多 如果未指定精度,则默认值为6。如果 精度小于之后出现的位数 Float.toString(Float)或返回的字符串中的小数点 Double.t

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

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

此输出是由于浮动格式
%f
对半取整操作造成的。如果你通过考试,你会得到更多

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


我认为您在使用System.out.printf()时遗漏了一些东西,如果您没有明确指定格式宽度,那么C中printf的默认行为(如果没有明确指定,则为小数点后6位)

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

所以它类似于像这样写

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

由于浮点格式说明符的一般语法为:

%[flags][width][.precision][argsize]typechar 
旁注:-

Java中也有一个用于此目的的

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

如果未指定精度,则默认值为6。如果 精度小于之后出现的位数 Float.toString(Float)或返回的字符串中的小数点 Double.toString(Double),则该值将四舍五入 使用对半取整算法


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

也有同样的问题,但它被较低精度的输出所隐藏。
%[flags][width][.precision][argsize]typechar