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
正常工作的消息?
即可找到答案
Returns a BigDecimal whose value is (this + augend), and whose scale is max(this.scale(), augend.scale()).
强调我的。所以 add
不会修改现有的 BigDecimal
- 它不能,因为 BigDecimal
是不可变的。 According to the docs、BigDecimal
是
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));
我有这样的代码
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
正常工作的消息?
Returns a BigDecimal whose value is (this + augend), and whose scale is max(this.scale(), augend.scale()).
强调我的。所以 add
不会修改现有的 BigDecimal
- 它不能,因为 BigDecimal
是不可变的。 According to the docs、BigDecimal
是
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));