2

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

是否有可能有一种舍入方法来避免额外或丢失一分钱的问题?这种四舍五入的方法是什么?

或者这是一个数学上无法解决的问题?

4

3 回答 3

2

一旦对数字进行四舍五入,信息就会丢失。解决您的问题的最佳方法是停止四舍五入(无论如何您都不应该用钱来做),并且仅在您在某处显示值时才四舍五入。

于 2012-09-28T16:40:50.803 回答
2

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

于 2012-10-02T12:07:33.150 回答
0

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

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

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

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

于 2016-12-22T05:31:26.663 回答