0

关于货币计算及其精度,我有一个四舍五入的问题。

我正在使用Java Money (Moneta) libaray 进行所有计算。

我使用将 BigDecimal 值存储在数据库中NUMERIC(19,4)

问题

鉴于我有总金额的购物车EUR 323.99。我想为这辆购物车提供 3 个月的分期付款,没有利率。

执行此操作时,323.99 / 3您将获得 Money 表示EUR 108.00(默认舍入 HALF_EVEN)和 BigDecimal 表示107.9966...667

每月付款107.9967在数据库中存储为所有 3 笔相等付款的数值。

在发票上,我会显示EUR 108.00客户的每月付款。

当我收到 的客户付款时EUR 108.00,我试图将此交易金额分配给未付款项,即内部数字值为 的 Money 107.9967。在我的查询方面,我想计算并显示此订单的剩余本金余额,但使用这些数字我无法生成准确的小数部分,因为我不允许在这里进行任何手动舍入,否则我会失去精度。

例如,如果我对 3 次付款进行以下计算:

1) 323.99 - 107.9967 = 215.9933
2) 215.9933 - 107.9967 = 107.9966
3) 107.9966 - 107.9967 = -0.0001

我留下了EUR 0.00具有内部 BigDecimal 值的 Money 值-0.0001

在计算另一种方式时也会发生同样的情况。最终结果将是正数0.0033,例如表示为EUR 0.00,但是当它累积时,第二次将是0.0066已经四舍五入到 的结果EUR 0.01,就好像客户会获得 1 美分一样。

问题

是否有任何建议应如何执行或截断或明确舍入此类计算?

我应该如何处理这种价值?实际上,当它是 0.00 时,我不应该关心小数点后 2 位的任何值,但从长远来看,客户交易日志总和将开始从这些计算中累积美分。以某种方式剥离 0.00 之后的所有值并将其完全保留为真正的 0 是否可以?

4

0 回答 0