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

pla*_*oom 7 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());
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

azu*_*rog 12

您没有执行相同的操作.

当您执行双操作时,正常的Java操作顺序正在应用:

a-a/1.05  
= a - (a/1.05)
Run Code Online (Sandbox Code Playgroud)

但是当您运行方法时BigDecimal,操作将按您调用它们的顺序进行评估,因此

b.subtract(b).divide(new BigDecimal(1.05))
Run Code Online (Sandbox Code Playgroud)

相当于

(b - b) / 1.05
= 0 / 1.05
= 0
Run Code Online (Sandbox Code Playgroud)


rge*_*man 8

链接方法调用时BigDecimal,操作顺序不会像在数学中那样保留,也不像doubleJava中的运算符那样保留.方法将按顺序执行.这意味着b.subtract(b)首先发生,导致BigDecimal 0.

要获得等效结果,请通过将divide方法的结果发送到方法来自行强制执行操作顺序subtract.

System.out.println(b.subtract( b.divide(new BigDecimal(1.05)) ).doubleValue());
Run Code Online (Sandbox Code Playgroud)