关于货币计算及其精度,我有一个四舍五入的问题。
我正在使用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 是否可以?