使用 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
。
为什么 decimalFormat 会改变我的值的比例?
双打只是近似值。这对双打来说是正确的。如果你想要一个特定的比例,你需要在 BigDecimal 构造函数中告诉它。
您正在进行双倍和反向转换。这是不必要的,并且会引入舍入误差。您应该使用以下代码:
private BigDecimal loadBigDecimal(String value) throws ParseException {
DecimalFormat df = new DecimalFormat("##.###");
df.setParseBigDecimal(true);
return (BigDecimal) df.parse(value);
}
那是因为 df.parse(value).doubleValue()
调用。此时,该值被转换为double。
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");
我正在尝试使用 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 会改变我的值的比例?
双打只是近似值。这对双打来说是正确的。如果你想要一个特定的比例,你需要在 BigDecimal 构造函数中告诉它。
您正在进行双倍和反向转换。这是不必要的,并且会引入舍入误差。您应该使用以下代码:
private BigDecimal loadBigDecimal(String value) throws ParseException {
DecimalFormat df = new DecimalFormat("##.###");
df.setParseBigDecimal(true);
return (BigDecimal) df.parse(value);
}
那是因为 df.parse(value).doubleValue()
调用。此时,该值被转换为double。
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");