关于BigDecimal ROUND_DOWN[重复]的问题。

问题描述 投票:0回答:1

情况是这样的,通过下面的代码预期的结果是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

java rounding bigdecimal
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.