BigDecimal.add() 被忽略

BigDecimal.add() being ignored

我有这样的代码

BigDecimal withoutTax, tax, withTax, totalPrice;
totalPrice = new BigDecimal(0.0);
BigDecimal amount = new BigDecimal(String.valueOf(table.getValueAt(table.getSelectedRow(), 3)).replace(",", "."));
BigDecimal price = new BigDecimal(String.valueOf(table.getValueAt(table.getSelectedRow(), 4)).replace(",", "."));
withoutTax = amount.multiply(price, new MathContext(5));
table.setValueAt(withoutTax.toPlainString(), table.getSelectedRow(), 5);
tax = withoutTax.multiply(new BigDecimal(0.23), new MathContext(2));
table.setValueAt(tax.toPlainString(), table.getSelectedRow(), 7);
withTax = withoutTax.add(tax, new MathContext(5));
table.setValueAt(withTax.toPlainString(), table.getSelectedRow(), 8);
totalPrice.add(withTax, new MathContext(5));
paymentNum.setText(String.valueOf(totalPrice.toPlainString()));

为什么我收到 totalPrice.add 被忽略而 withoutTax.add 正常工作的消息?

通过查看 the docs for BigDecimal

即可找到答案

Returns a BigDecimal whose value is (this + augend), and whose scale is max(this.scale(), augend.scale()).

强调我的。所以 add 不会修改现有的 BigDecimal - 它不能,因为 BigDecimal 是不可变的。 According to the docsBigDecimal

Immutable, arbitrary-precision signed decimal numbers.

它没有修改它的值,而是returns一个等于加法结果的新值。

改变这个:

totalPrice.add(withTax, new MathContext(5));

对此:

totalPrice = totalPrice.add(withTax, new MathContext(5));

将该新值赋回同一个变量,它会像您期望的那样正确更新。

将其与这一行进行比较:

withTax = withoutTax.add(tax, new MathContext(5));

您不会期望 withoutTax 的值仅仅因为您在计算中使用它而改变。为了使该行按预期工作,不允许 add 方法修改调用它的对象。

因为你没有分配它,BigDecimal 是不可变的,添加的结果将是一个你忽略的新创建的 BigDecimal 对象。

totalPrice = totalPrice.add(withTax, new MathContext(5));