2017-10-19 66 views
-1

我在這裏增加了三個大的小數,但它應該給我準確的答案。我在這裏有兩個字符串,然後轉換爲大數字。請不要問爲什麼我使用字符串。有一些業務,我將這些值作爲字符串,然後我需要轉換。請發現代碼Bigdecimal在Java中沒有給出確切的輸出

BigDecimal a= new BigDecimal(100.05); --> This value I receive from web service. Its a decimal value from the service. 
    String b= "100.05"; 
    String c= "200.03"; 
    System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c)))); 

輸出它給

400.1299999999999971578290569595992565155029296875

在哪裏,因爲它應該是400.13

回答

7

問題是您使用new BigDecimal(100.05)a的值是100.0499999999999971578290569595992565155029296875。

如果您已指定該值作爲一個字符串,而不是,一切都會好:

BigDecimal a = new BigDecimal("100.05"); 
String b = "100.05"; 
String c = "200.03"; 
System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c)))); 
// Output: 400.13 

如果有輸入作爲double,您可以用BigDecimal.valueOf(double)而不是調用構造函數:

BigDecimal a = BigDecimal.valueOf(100.05); // a is now exactly 100.05 

比較BigDecimal(double)文檔:

將double翻譯爲BigDecimal,它是double的二進制浮點值的精確十進制表示形式。 (...)

進行最終BigDecimal.valueOf(Double)

double轉換一個BigDecimal,使用由Double.toString(double)方法提供的雙規範的字符串表示。

注:這通常是轉換double(或float)成BigDecimal,作爲返回的值等於從由使用Double.toString(double)的結果構建BigDecimal所得的首選方式。

+1

謝謝喬恩。得到它了。犯了一個小錯誤 – Yakhoob

5
new BigDecimal(100.05) 

這給100.0499999999999971578290569595992565155029296875,因爲100.05不能準確爲double表示。

你必須在這裏使用的字符串,以及:

new BigDecimal("100.05") 

當你從一個Web服務這個值,你可能從String將其轉換爲一個float/double。如果是這種情況,只需跳過該轉換步驟即可。

如果你的Web服務存根映射返回值float/double,可以考慮直接映射到String,然後將其輸送到BigDecimal構造,像這樣:

double v = 100.05; // Value from web service 
BigDecimal a= new BigDecimal(String.valueOf(v)); 
String b= "100.05"; 
String c= "200.03"; 
System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c)))); 

Live Example

這是可行的,因爲字符串將只包含儘可能多的數字以區分幾乎100.05的值和可以表示的任何一邊的下一個值,因此我們得到字符串"100.05",然後BigDecimal可以正確處理。

+0

@Roman,你的意思是a或b值 – Yakhoob

+0

@TJCrowder感謝,我固定它應該指出的是BigDecimal類的文件實際上提到了使用雙重價值構造的問題的答案 –

+0

: https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#BigDecimal(double) - 特別是:*因此,通常建議使用String構造函數,而不是one。* –

0

您可以使用String.format將答案格式化爲小數位數,並指定多少位數。

System.out.println(String.format("%.2f", a.add(new BigDecimal(b).add(new BigDecimal(c)))));