2010-09-11 81 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 
相關問題