我有这样的代码
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
正常工作时会被忽略?
答案 0 :(得分:25)
返回一个BigDecimal,其值为(this + augend),其比例为max(this.scale(),augend.scale())。
强调我的。因此add
不会修改现有的BigDecimal
- 它不能,因为BigDecimal
是不可变的。 According to the docs,BigDecimal
是
不可变,任意精度的有符号十进制数。
它不是修改它的值,而是返回一个新值,它等于加法的结果。
改变这个:
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));