簡體   English   中英

使用DecimalFormat產生奇怪的BigDecimal值

[英]Strange BigDecimal value using DecimalFormat

我正在嘗試使用DecimalFormat將一些字符串值轉換為數字。 我嘗試以更好的方式向您解釋我的問題:

我有以下方法:

private BigDecimal loadBigDecimal(String value){

    BigDecimal bigDecimalToReturn = null;
    DecimalFormat df = new DecimalFormat("##.###");
    bigDecimalToReturn = new BigDecimal(df.parse(value).doubleValue());
    return bigDecimalToReturn;
}

現在,如果我嘗試運行該方法:

BigDeciaml dec = myObject.loadBigDecimal("120,11");

dec的值為120.1099999999999994315658113919198513031005859375 為什么十進制格式會更改我的值的小數位數?

您正在轉換成雙倍和倒退。 這是不必要的,並且會導致舍入錯誤。 您應該使用以下代碼:

private BigDecimal loadBigDecimal(String value) throws ParseException {
    DecimalFormat df = new DecimalFormat("##.###");
    df.setParseBigDecimal(true);
    return (BigDecimal) df.parse(value);
}

雙打只是近似值。 這是正確的兩倍。 如果需要特定的比例,則需要在BigDecimal構造函數中進行說明。

那是由於df.parse(value).doubleValue()調用。 此時,該值將轉換為雙精度。

double表示正或負2的冪的和(正和負指數)。

一個人可以將120寫成64 + 32 + 16 + 8。

但是,不能將0.11寫成2的冪的有限和。

因此有一個近似值。

0.1099999999999994315658113919198513031005859375

這是2的冪的和。

就像BigDecimal一樣,它是一個帶有parameter字符串構造函數 也許您可以使用它。

BigDecimal dec = new BigDecimal("120,11");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM