2012-09-28 34 views
2

我們使用Ruby的Money gem。在我們的應用程序中,我們也在貨幣之間轉換。什麼是Ruby Money gem的最佳rounding_method?

因此,當您在貨幣之間進行轉換時,出現舍入問題。目前我們正在使用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 
} 

是否有可能有一個四捨五入的方法來避免額外的或丟失一分錢的這個問題呢?這個舍入方法是什麼?

或者這是一個數學上不可解的問題?

回答

2

一旦您取整了一個數字,信息就會丟失。解決問題的最佳方法是停止四捨五入(無論如何你都不應該這樣做),只有當你在某個地方顯示值時纔會舍入。

+1

謝謝。我明白你的意思。不是四捨五入,我認爲你的意思是存儲浮點值。但是,我不認爲Ruby的Money寶石允許分數分(或便士)。

1.9.3-p0 :011 > Money.new(999.99,'USD') => # 
我想我可能必須在應用程序級別解決這個問題,而不是在Money寶石級別。 –

+0

複選標記將不勝感激。不是我真的需要它,但首先它表明這是你的答案,其次它讓人們更有動力回答你。正如我回答,我看到了你的接受比例,但我仍然這樣做了。如果你的百分比較高,你會得到3 +以上的答案,甚至更快。 – CQQL

+0

四捨五入是一個好主意。但是在Ruby Money gem的情況下,這似乎不可能,因爲Ruby money對象的準確性是整個分數,而不是分數分。思考? –

2

最新的Ruby Money gem支持分數美分。這將確保當一個貨幣對象被轉換成另一種貨幣並回到自身時,其價值將被保留。 所以沒有缺失/額外的問題。

0

在現實世界中,這可能不是一個問題,因爲「from」和「to」的匯率不會相互反轉。

另一方面,您需要來回轉換的場景是什麼?我能想到的唯一情況是,你正在總結了一堆錢在不同的貨幣對象:

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

,這將觸發從美元到歐元貨幣兌換並回到美元。 如果是這種情況,請嘗試https://github.com/lulalala/money-collection以在彙總多個Money對象時跳過不必要的貨幣兌換。

相關問題