当我将字符串解析为Double时,我对这个奇怪的“错误”感到非常困惑。
我已经设置了NumberFormat属性和符号。
传递具有15位数和2小数位的字符串时(例如。( str = "333333333333333,33")并使用Number num = NumberFormat.parse(str)解析它--结果是省略了一个数字。
num的实际值是3.333333333333333E14。
它似乎正在与Strings一起工作,虽然1,2和4.
有人能启发我吗?
干杯,恩里科
发布于 2011-08-16 09:51:27
简短的回答;由于圆周运动的错误
(double) 111111111111111.11 != (double) 111111111111111.1但
(double) 333333333333333.33 == (double) 333333333333333.3如果您希望获得更高的精度,请使用setParseBigDecimal并解析将返回一个BigDecimal。
这一切为什么要发生?这是因为你处于双倍精度的极限。这17条很好,因为它可以被代表。2只是双倍的这个和双存储的力量2,每两个力量的所有17个一个,所以17 4和17 8是好的。
然而,17个三分需要比double多一个位来表示值,最后一个位被截断。同样,17 5,6和9也有舍入错误。
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则显示了double表示的确切值。
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发布于 2011-08-16 09:38:44
在本例中,DecimalFormat.parse方法将返回一个Double,该Double具有有限的精度。
您不能期望它总是能够返回一个准确表示输入的数字。
可以使用BigDecimal.setParseBigDecimal允许数字格式从解析方法返回BigDecimal。此Number能够以任意精度表示您的值。(谢谢彼得·劳瑞指出这一点!)
https://stackoverflow.com/questions/7076180
复制相似问题