BigDecimal.add()被忽略

时间:2016-02-23 18:29:59

标签: java bigdecimal currency

我有这样的代码

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.addwithoutTax.add正常工作时会被忽略?

2 个答案:

答案 0 :(得分:25)

通过查看the docs for BigDecimal

来回答这个问题
  

返回一个BigDecimal,其值为(this + augend),其比例为max(this.scale(),augend.scale())。

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

  

不可变,任意精度的有符号十进制数。

它不是修改它的值,而是返回一个新值,它等于加法的结果。

改变这个:

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

到此:

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

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

将此与此行进行比较:

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

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

答案 1 :(得分:3)

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

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