我正在尝试使用BigDecimal
执行操作,但它始终返回0
。当我使用double
时,为什么会这样?
public static void main(String[] args) {
double a = 3376.88;
BigDecimal b = new BigDecimal(a);
System.out.println(a-a/1.05);
System.out.println(b.subtract(b).divide(new BigDecimal(1.05)).doubleValue());
}
感谢。
答案 0 :(得分:10)
您没有执行相同的操作。
当您进行双重操作时,正常的Java操作顺序正在应用:
a-a/1.05
= a - (a/1.05)
但是当您在BigDecimal
上运行方法时,操作将按照您调用它们的顺序进行评估,因此
b.subtract(b).divide(new BigDecimal(1.05))
相当于
(b - b) / 1.05
= 0 / 1.05
= 0
答案 1 :(得分:8)
当您为BigDecimal
链接方法调用时,操作的顺序不会像在数学中一样保留,也不像Java中的double
运算符那样保留。方法将按顺序执行。这意味着b.subtract(b)
首先发生,导致BigDecimal
0
。
要获得等效结果,请通过将divide
方法的结果发送到subtract
方法来强制执行操作顺序。
System.out.println(b.subtract( b.divide(new BigDecimal(1.05)) ).doubleValue());