我有一个关于货币计算及其精确性的舍入问题。
我使用java moneta libaray进行所有计算。
我在数据库中使用 NUMERIC(19,4)
问题
鉴于我有购物车的总金额 EUR 323.99
. 我想为这辆车提供3个月的分期付款,没有利率。
什么时候做 323.99 / 3
你会得到钱的 EUR 108.00
(默认四舍五入半个偶数)和 107.9966...667
每月付款存储为 107.9967
数据库中所有3个等额付款的数值。
在发票上我会显示 EUR 108.00
每月为客户付款。
当我收到客户付款时 EUR 108.00
,我正在尝试将此交易金额分配到未付款项,即内部数值为的货币 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值 -0.0001
同样的情况也会发生在用另一种方法计算的时候。最终结果是肯定的 0.0033
例如,表示为 EUR 0.00
但当它积累起来的时候,第二次就会是 0.0066
已经四舍五入到 EUR 0.01
,好像顾客会得到1美分。
问题
是否有任何建议,这些计算应该如何执行或截断或不适当的四舍五入?
我应该如何处理这种价值观?实际上,当值为0.00时,我不应该关心任何超过2个小数点的值,但从长远来看,客户事务日志总和将开始从这些计算中累积美分。以某种方式去掉0.00之后的所有值,并将其完全保留为真实的0,可以吗?
暂无答案!
目前还没有任何答案,快来回答吧!