BigDecimal添加了错误的值

时间:2017-05-12 07:19:22

标签: java bigdecimal

我的BigDecimal定义如下:

private static final BigDecimal sd = new BigDecimal(0.7d);

如果我打印它,我得到值:

0.6999999999999999555910790149937383830547332763671875

导致一些错误的计算。有没有人知道如何将0.7的确切值作为BigDecimal?将其更改为0.71会查看正确的结果,但它不应该是那样

3 个答案:

答案 0 :(得分:7)

使用字符串文字:

private static final BigDecimal sd = new BigDecimal("0.7");

如果您使用double,则会调用public BigDecimal(double val)。你没有得到0.7的原因是它不能用double完全表示。有关更多信息,请参阅链接的JavaDoc。

答案 1 :(得分:1)

您应该使用字符串文字中的声明值,例如new BigDecimal("0.7");

答案 2 :(得分:0)

BigDecimal构造double非常复杂。首先,只能通过绕行字符串来完成。 (您无法使用正确的doubleMathContext来构造函数。我已经做了很多尝试。最近,在某些情况下,由于小数点前的位数需要更改,要舍入,就变得很困难。因此,Javadoc中的警告是您不应使用它。)

但是,即使到那里,用简单的String.format()还是不够的,因为String.format()对默认Locale敏感,并根据系统/ VM设置输出不同的十进制分隔符,而BigDecimal构造函数始终需要一个点作为小数点分隔符。因此,您必须使用Formatter构建自己的Locale.US。如果您已启动并运行它,则会收到有关资源未封闭的警告。

我发现这可行:

static BigDecimal toBigDecimal(double value, int decimalPlaces) {
    String format = "%." + decimalPlaces + "f";
    try (Formatter formatter = new Formatter(Locale.US)) {
        String formatted = formatter.format(format, value).toString();
        return new BigDecimal(formatted);
    }
}