Ruby Money gem最好的rounding_meodod是什么?

时间:2012-09-28 16:36:27

标签: ruby-on-rails ruby currency

我们正在使用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
}

是否有可能采用舍入方法来避免额外或丢失一分钱的问题?那种舍入方法会是什么?

或者这是一个数学上不可解决的问题?

3 个答案:

答案 0 :(得分:2)

对数字进行舍入后,信息将丢失。解决问题的最佳方法是停止舍入(无论如何都不应该使用金钱),只有当你在某处显示值时才进行舍入。

答案 1 :(得分:2)

最新的Ruby Money gem支持小数美分。这将确保当货币对象转换为另一种货币并返回其自身时,其价值将被保留。 所以没有遗漏/额外的问题。

答案 2 :(得分:0)

在现实世界中,这可能不是一个问题,因为“从”和“到”的汇率不会相互反转。

另一方面,您需要来回转换的场景是什么?我能想到的唯一场景是你用不同的货币总结了一堆Money对象:

[1美元,2欧元,3美元]

这将引发从美元到欧元再回到美元的货币兑换。 如果是这种情况,请在汇总许多Money对象时尝试https://github.com/lulalala/money-collection跳过不必要的货币兑换。