2015-02-24 54 views
1

我想使用DecimalFormat在数字中转换一些字符串值。我试图解释,你在一个更好的方法我的问题:使用DecimalFormat的奇怪的BigDecimal值

我有以下方法:

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"); 

月的值120.1099999999999994315658113919198513031005859375。 为什么decimalFormat正在改变我的价值的规模?

回答

5

你正在做转换为双向和反向。这是不必要的,并引入舍入错误。您应该使用以下代码:

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

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

1

这是因为拨打了df.parse(value).doubleValue()。此时,该值将转换为双精度值。

double表示加或减2的幂和(具有正指数和负指数)。

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

但一个不能写0.11为2

权力的有限和因此,有一种近似。

0.1099999999999994315658113919198513031005859375

这是2

功率的总和它看起来像的BigDecimal为constructor with a string for parameter。也许你可以使用它。

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