简短的回答;由于圆误差
(double) 111111111111111.11 != (double) 111111111111111.1
但
(double) 333333333333333.33 == (double) 333333333333333.3
如果你想更精确,使用setParseBigDecimal和解析会返回一个BigDecimal。
为什么会发生这种情况?这是因为你处于double精度的极限。这17个很好,因为它可以代表。 2的数量只是双倍,而双店的两个功率是17个中的两个,所以17个和17个八个都是好的。
但是,17三位需要比double多一位来表示该值,并且该最后一位被截断。同样,17五,六和九也有舍入误差。
double[] ds = {
111111111111111.11,
222222222222222.22,
333333333333333.33,
444444444444444.44,
555555555555555.55,
666666666666666.66,
777777777777777.77,
888888888888888.88,
999999999999999.99};
for (double d : ds) {
System.out.println(d + " - " + new BigDecimal(d));
}
打印以下内容。在打印之前,double
稍微圆整,BigDecimal显示双精度值的确切值。
1.1111111111111111E14 - 111111111111111.109375
2.2222222222222222E14 - 222222222222222.21875
3.333333333333333E14 - 333333333333333.3125
4.4444444444444444E14 - 444444444444444.4375
5.5555555555555556E14 - 555555555555555.5625
6.666666666666666E14 - 666666666666666.625
7.777777777777778E14 - 777777777777777.75
8.888888888888889E14 - 888888888888888.875
1.0E15 - 1000000000000000
有没有一种解决方法,使它不解析,而是让它变长? – Mallinok
'long'是一个整数类型,因此你会失去小数部分(',33')。 – aioobe
@aioobe,你可以看看Java 1.4的文档吗?这个方法是在Java 5.0中添加的。 http://download.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html#setParseBigDecimal%28boolean%29 –