使用BigDecimal进行Java舍入问题和计算

时间:2014-07-29 11:56:07

标签: 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舍入模式,因为它用于簿记,也因为这个案例也涉及财务。

我可以在舍入值后添加它。然后报告计算就可以了。但它不代表数据库中的实际值(.553接近.55,但如果我在舍入后将其加起来,结果将是.56,。553不接近.56)。

无论如何都要克服这个问题?我环顾四周看看如何制作试算平衡报告,但我找不到合适的解决办法吗?

编辑1

我在这样的金融系统中看过试算平衡报告,它们是否在四舍五入后进行计算?我一直将此与试算平衡报告进行比较,因为此报告类似于一个报告。

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

编辑3 基于@MarcioB,@ user3679868和@JoopEggen决定根据舍入值进行计算。差异.047(.56 - .553)显然已被注销(审计标准)!

2 个答案:

答案 0 :(得分:1)

如果您在一张桌子中使用四舍五入并且不在另一张桌子上使用它,那么无论采用舍入方法,您都会遇到此问题。

这里我们使用微积分的完整数字,并在报告中截断它。

答案 1 :(得分:1)

因为如果您希望总计等于帐户总数,那么您将对每个帐户进行四舍五入,您必须使用帐户的舍入值计算总计。