当我使用BigDecimal时,为什么我的操作不起作用?

时间:2014-05-07 18:42:03

标签: java bigdecimal

我正在尝试使用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());
}

感谢。

2 个答案:

答案 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());