下面的第一行将打印0.8999999999999999
,这是因为精度丢失导致的,这很清楚。但第二行将打印0.9
,我不明白为什么。这个计算不应该有同样的问题吗?
System.out.println(2.00-1.10);
System.out.printf("%f",2.00-1.10);
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)返回的字符串中小数点后出现的数字,则使用“四舍五入”算法进行取舍。
%f
的"四舍五入"操作引起的。如果你查看文档,你会得到以下信息:根据我的理解,格式 %f 只输出1个字符。它输出0.9是标准数学四舍五入的行为。