2015-11-05 132 views
1

首先,在數據庫表中的列是與DECIMAL10,4的長度。Ruby on Rails的 - 的BigDecimal計算錯誤

如果我這樣做是在控制檯上,甚至在控制器,結果是正確的:

rate = (1/0.7126) * 1.0883 

,但如果我這樣做,這是行不通的:

rate = (1/from_rate) * to_rate 

結果簡直就是to_rate的價值。

from_rateto_rate是數據庫查詢的結果和值是正確的,如果我登錄使用.class結果是BigDecimal類的,所以我不知道爲什麼按預期這一計算不工作。

我試過明確轉換使用to_dBigDecimal.new但他們似乎沒有什麼區別。

+1

有趣的問題......它看起來像整數除法方法輸出一個整數當參數是BigDecimal?適用於Float,但不適用於BigDecimal?試試這個...'rate =(1.0/from_rate)* to_rate' ...它可能是浮點除法方法來處理它。 – SteveTurczyn

+0

謝謝@SteveTurczyn,我的意思是在發佈之前嘗試類似的東西。它恐怕不起作用,結果也是一樣。我能想到的唯一解決方法是將費率乘以1,000以使它們成爲整數,但我寧願不這樣做。 – martincarlin87

+0

如果你做'(1/from_rate)',控制器的結果是什麼?那是返回'1'整數嗎?如果使用'from_rate.to_f'或'(0 + from_rate)',會發生什麼?我想確認,該司部分返回1,看看如果這是有關的格式'from_rate' – SteveTurczyn

回答

1

從證據,它看起來像整數除法實例方法(通過/援引作爲(1/from_rate)當參數(除數)爲BigDecimal的,所以在這種情況下,它返回整數值1返回一個整數的結果。這ISN」如果參數是一個浮點數,就會出現問題,因爲在這種情況下,整數除法返回浮點數。

您可以通過僅使用浮點除數來規避此問題...通過指定1.0(浮點數)作爲分紅

rate = (1.0/from_rate) * to_rate 

or alternat您可以將from_rate值轉換爲浮點數。

rate = (1/from_rate.to_f) * to_rate