2013-09-10 73 views
2

我有一個Rails應用程序處理一些數據,其中一些數據包括帶小數的數字,如1.9943,以及這些數字和其他整數之間的分界。我想知道存儲這個最好的方法是什麼。浮點數,小數或整數

我想存儲的數字,將保留整數作爲整數和數字,可能成爲十進制小數。雖然這是一個奇怪的格式一樣

#<BigDecimal:7fda470aa9f0,'0.197757E1',18(18)> 

似乎當我把兩個十進制數或整數小數執行正確的算法。當我嘗試用整數分割整數時,它不能正常工作。我認爲rails會自動將結果轉換爲適當的小數,但它似乎將其保留爲整數並去除剩餘部分。我能做些什麼嗎?

什麼是最好的方式來存儲這種類型的信息?我應該將它全部存儲爲小數,還是浮點數?

回答

3

如果你想不損失精度來劃分兩個整數,你需要投下他們的一至FloatBigDecimal第一:

irb(main):007:0> 2/3 
=> 0 
irb(main):008:0> Float(2)/3 
=> 0.666666666666667 

我有點困惑,當你說,你當不同的結果你將Float/Integer和Integer/Float分開嗎?這些應該有相同的結果:

irb(main):010:0> Integer(2)/Float(3) 
=> 0.666666666666667 
irb(main):011:0> Float(2)/Integer(3) 
=> 0.666666666666667 
irb(main):012:0> String(BigDecimal('2')/3) 
=> "0.666666666666666666666666666666666666666666666666666667E0" 
irb(main):013:0> String(2/BigDecimal('3')) 
=> "0.666666666666666666666666666666666666666666666666666667E0" 

你能提供一個代碼示例嗎?

就存儲而言,任何整數數據都應該存儲爲Integer,而不管它在將來的計算中的預期用途。

存儲浮動與BigDecimals取決於您需要多少精度。如果您不需要太高的精度,則Float將提供雙精度表示。如果您需要高精度,BigDecimal將提供任意精度表示。

相關:Ruby Numbers - 解釋整數之間的差異,浮標,BigDecimals的,而有理數

+0

抱歉,我犯了一個錯誤。整數/十進制工作正常 – user2158382

+0

這工作除了我用BigDecimal而不是浮動。你能告訴我爲什麼我應該使用float嗎? – user2158382

+0

@ user2158382當您需要任意精確的表示時,使用BigDecimal。當雙精度表達式足夠時使用浮點數。 – dbyrne