我们正在使用Ruby的Money gem。在我们的应用程序中,我们也在转换货币。
因此,当您在货币之间进行转换时,会出现舍入问题。目前我们正在使用Ruby的内置Float#round
。
然而,这引入了“悬空的便士”问题。
Money.new(500,'USD').exchange_to('EUR')
#=> #Money cents:385 currency:EUR
Money.new(500,'USD').exchange_to('EUR').exchange_to('USD')
#=> #Money cents:501 currency:USD
因此转换为欧元然后回来后,5.00美元变为5.01美元!这些是我们使用的汇率:
{
"GBP_TO_USD"=>1.6,
"USD_TO_GBP"=>0.625,
"GBP_TO_EUR"=>1.2,
"EUR_TO_GBP"=>0.8333333333333334,
"EUR_TO_USD"=>1.3,
"USD_TO_EUR"=>0.7692307692307692
}
是否有可能采用舍入方法来避免额外或丢失一分钱的问题?那种舍入方法会是什么?
或者这是一个数学上不可解决的问题?
答案 0 :(得分:2)
对数字进行舍入后,信息将丢失。解决问题的最佳方法是停止舍入(无论如何都不应该使用金钱),只有当你在某处显示值时才进行舍入。
答案 1 :(得分:2)
最新的Ruby Money gem支持小数美分。这将确保当货币对象转换为另一种货币并返回其自身时,其价值将被保留。 所以没有遗漏/额外的问题。
答案 2 :(得分:0)
在现实世界中,这可能不是一个问题,因为“从”和“到”的汇率不会相互反转。
另一方面,您需要来回转换的场景是什么?我能想到的唯一场景是你用不同的货币总结了一堆Money对象:
[1美元,2欧元,3美元]
这将引发从美元到欧元再回到美元的货币兑换。 如果是这种情况,请在汇总许多Money对象时尝试https://github.com/lulalala/money-collection跳过不必要的货币兑换。