Java BigDecimal 的舍入问题和计算

标签 java rounding bigdecimal rounding-error bankers-rounding

我有一个由 BigDecimal 数字组成的数据集。我想在报告中介绍这一点。我已成功生成以下格式的报告。这有点类似于会计中的试算表。但事实并非如此! 表中数据的数值保留了 4 位小数。但在报告中应四舍五入至小数点后两位。 报告也必须准确,因此使用 BigDecimal

+--------+---------+--------+
|Account | Debits  | Credits|
+--------+---------+--------+
|A       | 0.2760  | 0.1630 |
+--------+---------+--------+
|B       | 0.2770  | 0.2640 |
+--------+---------+--------+
|Total   | 0.5530  | 0.4270 |
+--------+---------+--------+

真正的问题是显示总数的时候。四舍五入后,总数无法正确相加。

+--------+---------+--------+
|Account | Debits  | Credits|
+--------+---------+--------+
|A       | 0.28    | 0.16   |
+--------+---------+--------+
|B       | 0.28    | 0.26   |
+--------+---------+--------+
|Total   | 0.55    | 0.43   |
+--------+---------+--------+

我使用 HALF_EVEN 舍入模式,因为它用于簿记,也因为此案例也涉及财务。

我可以在四舍五入后将其相加。然后报告计算就OK了。但它不会代表数据库中的实际值(0.553 接近 0.55,但如果我在四舍五入后将其相加,结果将是 0.56,0.553 并不接近 0.56)。

有什么办法可以解决这个问题吗?我四处查看试算表报告是如何制作的,但我找不到任何合适的解决方案?

编辑 1

我在金融系统中见过这样的试算表报告,他们是在四舍五入后进行计算吗?我一直将此与试算表报告进行比较,因为该报告与一份报告相似。

编辑2
可以对舍入值进行计算吗?我了解到,不建议对舍入值进行计算,因为原始值会被丢弃。

编辑3 基于@MarcioB、@user3679868 和@JoopEggen 决定根据舍入值进行计算。 0.047 (0.56 - 0.553) 的差异显然已被注销(审核标准)!

最佳答案

因为您要对每个帐户进行四舍五入,如果您希望总计等于帐户总和,则必须使用帐户的四舍五入值来计算总计。

关于Java BigDecimal 的舍入问题和计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25014727/

相关文章:

java - 在java中从父目录创建文件的File对象

Java异常问题

java - 使用 Java BigDecimal 仍然不能正确解决

java - 在 Apache Velocity 中格式化 BigDecimal

java - 四舍五入小数时得到不同的结果

java - 库取决于 Spring 版本的集成应用程序

java - 如果字段实现了接口(interface),如何实现该接口(interface)

使用舍入到偶数将整数转换为半精度浮点格式

python - 用 numpy 打破平局

ruby - 为什么在 Ruby 中除法后负数会向下舍入?