2010-09-11 67 views
4

我想从一个字符串做一个BigDecimal。不要问我为什么,我只是需要它!这是我的代码:BigDecimal from Double的值不正确?

Double theDouble = new Double(".3"); 
System.out.println("The Double: " + theDouble.toString()); 
BigDecimal theBigDecimal = new BigDecimal(theDouble); 
System.out.println("The Big: " + theBigDecimal.toString()); 

这是我得到的输出?

The Double: 0.3 
The Big: 0.299999999999999988897769753748434595763683319091796875 

任何想法?

回答

12

当您创建一个double时,值0.3不能完全表示。可以创建从一个字符串一个BigDecimal没有中间双,如在

new BigDecimal("0.3") 

浮点数被表示为二进制分数和指数。因此有一些数字不能完全表示。在基数10中有一个与1/3相似的问题,它是0.333333333 .....任何1/3的小数表示都是不精确的。这发生在二进制不同的分数集合中,而0.3是二进制不精确的集合之一。

+0

为什么不能它是repres完全是一个双? – Diego 2010-09-11 23:06:30

+2

@Diego:即使不是最常见的SO问题,至少在前五名中也是如此。虽然这需要一点时间才能理解。阅读[每个计算机科学家应该知道什么关于浮点运算](http://docs.sun.com/source/806-3568/ncg_goldberg.html) – 2010-09-11 23:08:00

+0

@Michael Petrotta好的谢谢! – Diego 2010-09-11 23:10:27

0

您可以给一个大的小数点指定的精度。例如添加到您的示例:

Double theDouble = new Double(".3"); 
theBigDecimal = new BigDecimal(theDouble, new MathContext(2)); 
System.out.println("The Big: " + theBigDecimal.toString()); 

这会打印出“0.30”

+0

谢谢,但我并不总是知道精度会是。我实际上是从文件中读取的字符串。 – Diego 2010-09-11 23:18:15

0

另一种方法是使用MathContext.DECIMAL32这保证了7位精度(这是不够好,在我们的例子):

Double theDouble = new Double(".3"); 
System.out.println("The Double: " + theDouble.toString()); 
BigDecimal theBigDecimal = new BigDecimal(theDouble, MathContext.DECIMAL32); // <-- here 
System.out.println("The Big: " + theBigDecimal.toString()); 

输出

The Double: 0.3 
The Big: 0.3000000 
相关问题