如何解决BigDecimal 添加函数显示值不正确
我有以下代码:
AtomicReference<BigDecimal> totalAmount = new AtomicReference<>(new BigDecimal(BigInteger.ZERO,new MathContext(3)));
List<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal(8024));
list.add(new BigDecimal(8024));
list.forEach(value -> {
totalAmount.set(totalAmount.get().add(value,new MathContext(3)));
});
基本上,当我运行上面的代码时,总金额的总和应该是 16048
,而是`1.60E+4。
请建议我在这里缺少什么以获得正确的金额?
解决方法
您似乎遗漏了两件事:
- 对于值:添加时使用
new MathContext(3)
会导致值四舍五入为三位数。首先添加 8024,总和 8024 被四舍五入为 8020。前三位以外的所有数字都设置为 0,向上或向下四舍五入。然后再次添加 8024,总和 16044 被四舍五入为 16000。 - 对于输出格式:当您打印
BigDecimal
时,您是(隐式或显式)调用其toString
方法。这种方法经常会产生你得到的科学记数法。何时执行的确切规则在文档中,请参阅底部的链接。如果您想确保控制BigDecimal
的格式,请使用DecimalFormat
。 - 在此示例中与您不需要的输出无关:您在添加
AtomicReference
和get()
时误用了set()
。在多线程环境中(这是AtomicReference
有意义的地方)不同的线程可能会在这两个调用之间执行set()
或其他操作,但是当您执行set()
时,结果会丢失{1}}。相反,您应该使用accumulateAndGet
的getAndAccumulate
(或AtomicReference
)方法。
我也不明白你为什么要以如此复杂的方式做事。这种更简单的方法可以满足您的要求:
List<BigDecimal> list = List.of(new BigDecimal("8024"),new BigDecimal("8024"));
BigDecimal totalAmount = BigDecimal.ZERO;
for (BigDecimal value : list) {
totalAmount = totalAmount.add(value);
}
System.out.println(totalAmount);
输出为:
16048
它类似于另一个答案中的代码。
编辑:作为一个好习惯,我将字符串文字传递给 new BigDecimal()
。虽然传递整数文字(例如 8024)本身没有问题,但传递双精度文字(例如 8024.1)通常意味着不准确。传递字符串将始终为您提供一个 BigDecimsl
,其中包含与字符串完全相同的值。
文档链接
,BigDecimal
及其 add()
方法将产生所需的结果。这里不需要使用 lambda 表达式。下面的代码演示了相同的内容。这也是干净的代码。
public static void main(String[] args) {
List<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal(8024));
list.add(new BigDecimal(8024));
BigDecimal total = BigDecimal.ZERO;
for(BigDecimal element : list)
total = total.add(element);
System.out.print("Sum : " + total);
}
看到这个code run live at IdeOne.com。
总和:16048
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。