【问题标题】:BigDecimal.add() being ignoredBigDecimal.add() 被忽略
【发布时间】:2016-06-05 18:03:10
【问题描述】:

我有这样的代码

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 工作正常?

【问题讨论】:

  • 您分配了withoutTax.add 的结果,而忽略了totalPrice.add 的结果。如果您不想忽略结果,请将其分配给变量,就像您为 withoutTax.add 所做的那样
  • 仅供参考: 不鼓励使用BigDecimal(double val)。请参阅javadoc 了解原因。 --- 在add() 调用上指定new MathContext(5) 是不必要的。

标签: java bigdecimal currency


【解决方案1】:

查看the docs for BigDecimal即可回答

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

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

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

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

改变这个:

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

到这里:

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

将该新值分配回同一个变量,它会按照您的预期正确更新。

将其与这一行进行比较:

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

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

【讨论】:

  • 谢谢,刚开始用这个 java 钱的东西
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2014-02-25
    • 2011-05-09
    • 2015-02-08
    • 2011-03-27
    • 2010-11-19
    • 2018-01-18
    相关资源
    最近更新 更多