如何解决Java Money 奇数除法和四舍五入而不损失/增加美分
我有一个关于货币计算及其精度的舍入问题。
我使用 Java Money (Moneta) libaray 进行所有计算。
我使用 NUMERIC(19,4)
问题
鉴于我的购物车总量为 EUR 323.99
。我想为这辆购物车提供 3 个月无利率分期付款。
执行 323.99 / 3
时,您将获得 EUR 108.00
的 Money 表示(默认舍入 HALF_EVEN)和 107.9966...667
的 BigDecimal 表示
对于所有 3 次等额付款,每月付款在数据库中存储为 107.9967
数值。
在发票上,我会显示客户每月支付的 EUR 108.00
。
当我收到 EUR 108.00
的客户付款时,我尝试将此交易金额分配给未结付款,即内部数值为 107.9967
的 Money。在我的查询方面,我想计算并显示此订单的剩余本金余额,但使用这些数字我无法生成准确的小数部分,因为我不允许在这里进行任何手动舍入,否则我会失去精度。
例如,如果我要对 3 次付款进行以下计算:
1) 323.99 - 107.9967 = 215.9933
2) 215.9933 - 107.9967 = 107.9966
3) 107.9966 - 107.9967 = -0.0001
我的 Money 值为 EUR 0.00
,内部 BigDecimal 值为 -0.0001
在计算另一种方式时也会发生同样的情况。最终结果将是正数 0.0033
,例如表示为 EUR 0.00
,但是当它累积时,第二次将是 0.0066
,它已经四舍五入为 EUR 0.01
,就好像客户会获得 1 美分一样。
问题
是否有任何建议应该如何执行或截断或明确舍入此类计算?
我应该如何处理这种价值?实际上,当它是 0.00 时,我不应该关心超过 2 个小数点的任何值,但从长远来看,客户交易日志总和将开始从这些计算中累积美分。以某种方式去除 0.00 之后的所有值并将其完全保留为真正的 0 是否可以?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。