为什么下面的java代码会打印相同浮点变量的不同值(小数部分)?
public static void main(String[] args) {
float f = 2001797.11f;
System.out.println(String.format("%013.2f", f));
System.out.println(Float.toString(f));
System.out.println(String.format("%018.5f", f));
}
输出:
0002001797.13
2001797.1
000002001797.12500
答案 0 :(得分:2)
混淆源于float f = 2001797.11f;
行。与数学值float
最接近的"2001797.11"
实际上是2001797.125
。你可以通过
System.out.println(new BigDecimal(2001797.11f));
因此,f
实际上是2001797.125
,String.format
的2次使用已正确舍入。
那么为什么Float.toString(f)
不会产生"2001797.125"
?这是因为Float.toString
只显示足够的小数位,以便将值与其他float
区分开来。在这种情况下,只需在小数位后显示1
即可。
答案 1 :(得分:2)
您必须考虑float
和double
类型处理浮点数字:这意味着它们必须在整数和小数部分之间分配32位或64位
所以:整数部分中的大多数位,大多数位将专用于它们,小数部分的位数越少。因此,小数部分将不太准确。
你遇到的问题来自两个事实:
如果您需要更多精确度(根据您的程序必须处理的值的比例),您应该迁移到double
。如果你想要无限期,那就BigDecimal
。
答案 2 :(得分:0)
String.format
使用显式格式规则
Float.toString(float n)
使用文档中描述的算法:
http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#toString(float)