2017-10-09 372 views
1

我有下面的一段代碼,我的精確度在將BigDecimal轉換爲String時丟失了。任何幫助,真的很感激。
預期結果:95.10000000000000%
實際結果:95.09999999999999%Java BigDecimal轉爲字符串

public static String getAsString(Object value) 
{ 
    if (value == null) 
     return null; 

    if (value.toString().length() == 0) 
     return null; 

    BigDecimal inputVal = new BigDecimal(value.toString()); 

    if (inputVal == new BigDecimal(0)) 
     return ""; 

    NumberFormat numberFormat = NumberFormat.getPercentInstance(Locale.US); 
    numberFormat.setMinimumFractionDigits(14); 
    numberFormat.setMaximumFractionDigits(14); 
    if (numberFormat instanceof DecimalFormat) { 
     DecimalFormat df = (DecimalFormat) numberFormat; 
     df.setNegativePrefix("("); 
     df.setNegativeSuffix("%)"); 
    } 

    String num = null; 
    num = numberFormat.format(new BigDecimal(95.1).divide(new BigDecimal(100))); 

    return num; 
} 
+0

你給什麼輸入它來重現問題? – marstran

+5

此外,'inputVal == new BigDecimal(0)'將始終失敗。沒有任何物體永遠不會像新創造的物體一樣。改用'equals'。 – marstran

+0

@marstran雖然你對錯誤的引用比較是正確的,但equals不是正確的使用方法,因爲BigDecimal.equals中的equals是考慮了規模的(查看文檔)。 您應該改用'BigDecimal.compareTo'。 –

回答

0

試試這個

BigDecimal inputVal = new BigDecimal(value.toString()).setScale(3, RoundingMode.HALF_UP); 
+0

它沒有給出預期的結果。請檢查你的答案。 – imk

1

您可以使用setScale,然後轉換爲字符串。

我看到你想要打印14位數字,所以設置比例爲14,並使用四捨五入。

BigDecimal inputVal = new BigDecimal(95.10000000000000).setScale(14, RoundingMode.UP); 

然後調用toString並添加%等

7

有了這個實例創建

new BigDecimal(95.1) 

losing some precision。什麼,你其實可以做的是使用字符串構造:

new BigDecimal("95.1") 

爲你的情況的另一種方法是使用工廠方法:

BigDecimal.valueOf(95.1) 
BigDecimal.valueOf(100) 

內部這些使用這些數字的字符串表示創建BigDecimal對象。

+0

非常感謝,現在工作 –

1

在這種情況下,使用new BigDecimal(double x)double作爲參數,碰巧雙精度不能完全表示x.xxxx。因此x.xxxx被「轉換」爲最接近的可能的雙倍數,即x.0000xxxxxxxxxxxzzzzzzzzzzyyyyy,這就是您的BigDecimal所展示的。

因此,這裏的解決方案可能是您可以使用String構造函數或valueOf()方法創建您的double d值的標準表示。

通過改變你的線

num = numberFormat.format(new BigDecimal(95.1).divide(new BigDecimal(100))); 

num = numberFormat.format(BigDecimal.valueOf(95.1).divide(BigDecimal.valueOf(100))); 

num = numberFormat.format(new BigDecimal("95.1").divide(new BigDecimal("100"))); 

應該給你正確的結果。

0

您可以使用字符串值

num = numberFormat.format(new BigDecimal("95.1").divide(new BigDecimal("100")));