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