使用DecimalFormat的奇怪BigDecimal值

时间:2015-02-24 15:35:06

标签: java bigdecimal 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。 为什么decimalFormat会改变我的值的范围?

3 个答案:

答案 0 :(得分:5)

您正在进行双向和向后转换。这是不必要的,并引入了舍入错误。您应该使用以下代码:

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

答案 1 :(得分:3)

双打只是近似值。这对双人来说是正确的。如果你想要一个特定的比例,你需要在BigDecimal构造函数中告诉它。

答案 2 :(得分:1)

这是因为df.parse(value).doubleValue()电话。此时,该值将转换为double。

double表示加上或减去2的幂的总和(带正指数和负指数)。

可以将120写成64 + 32 + 16 + 8。

但是不能把0.11写为2的有限和幂。

所以有一个近似值。

0.1099999999999994315658113919198513031005859375

这是2的幂的总和。

它看起来像一个constructor with a string for parameter的BigDecimal。也许你可以使用它。

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