我正在尝试使用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会改变我的值的范围?
答案 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");