首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumberFormat分析问题

NumberFormat分析问题
EN

Stack Overflow用户
提问于 2011-08-16 09:33:44
回答 2查看 1.5K关注 0票数 3

当我将字符串解析为Double时,我对这个奇怪的“错误”感到非常困惑。

我已经设置了NumberFormat属性和符号。

传递具有15位数和2小数位的字符串时(例如。( str = "333333333333333,33")并使用Number num = NumberFormat.parse(str)解析它--结果是省略了一个数字。

num的实际值是3.333333333333333E14

它似乎正在与Strings一起工作,虽然1,2和4.

有人能启发我吗?

干杯,恩里科

EN

回答 2

Stack Overflow用户

发布于 2011-08-16 09:51:27

简短的回答;由于圆周运动的错误

代码语言:javascript
复制
(double) 111111111111111.11 != (double) 111111111111111.1

代码语言:javascript
复制
(double) 333333333333333.33 == (double) 333333333333333.3

如果您希望获得更高的精度,请使用setParseBigDecimal并解析将返回一个BigDecimal。

这一切为什么要发生?这是因为你处于双倍精度的极限。这17条很好,因为它可以被代表。2只是双倍的这个和双存储的力量2,每两个力量的所有17个一个,所以17 4和17 8是好的。

然而,17个三分需要比double多一个位来表示值,最后一个位被截断。同样,17 5,6和9也有舍入错误。

代码语言:javascript
复制
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表示的确切值。

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2011-08-16 09:38:44

在本例中,DecimalFormat.parse方法将返回一个Double,该Double具有有限的精度

您不能期望它总是能够返回一个准确表示输入的数字。

可以使用BigDecimal.setParseBigDecimal允许数字格式从解析方法返回BigDecimal。此Number能够以任意精度表示您的值。(谢谢彼得·劳瑞指出这一点!)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7076180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档