我的BigDecimal
定义如下:
private static final BigDecimal sd = new BigDecimal(0.7d);
如果我打印它,我得到值:
0.6999999999999999555910790149937383830547332763671875
导致一些错误的计算。有没有人知道如何将0.7
的确切值作为BigDecimal
?将其更改为0.71
会查看正确的结果,但它不应该是那样
答案 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
非常复杂。首先,只能通过绕行字符串来完成。 (您无法使用正确的double
和MathContext
来构造函数。我已经做了很多尝试。最近,在某些情况下,由于小数点前的位数需要更改,要舍入,就变得很困难。因此,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);
}
}