情况是这样的,通过下面的代码预期的结果是123.10实际上是123.09,对于这个结果有点不知所云,ROUND_DOWN不是被截断了吗,为什么还要计算,123.2000会被截断成123.20,是什么原理呢? jdk1.8
public static void main(String[] args){
BigDecimal b = new BigDecimal(123.1000);
System.out.println(b.setScale(2, BigDecimal.ROUND_DOWN));
}
123.09
进程结束,退出代码0
你用的是 BigDecimal(double)
构造函数,其文档中写道。
这个构造函数的结果可能有些不可预知。人们可能会认为,写
new BigDecimal(0.1)
在Java中创建一个BigDecimal
它恰好等于0.1(1的非比例值,比例为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能完全表示为一个double
(或者,对于这个问题,作为任何有限长度的二进制分数)。 因此,正在传递的值 在 尽管表面上看起来是这样,但对构造函数的影响并不完全等于0.1。
解决方法是使用 BigDecimal(String)
构造函数来代替。
public static void main(String[] args) {
final BigDecimal b = new BigDecimal("123.1000");
System.out.println(b.setScale(2, BigDecimal.ROUND_DOWN));
}
和你想象的一样
123.10
Process finished with exit code 0