2010-06-17 29 views

回答

44

這個參數總是有兩面 - 小數和整數。整數支持者認爲小數可能不準確(在進行轉換時),並且BigDecimal實現包含錯誤,有時甚至是段錯誤。

對於我自己的項目,我也選擇了整數,將它們包裹在一個自定義容器中,將美分轉換爲「真實」數額並返回。起初,它似乎很好,過了一段時間它變得非常繁瑣 - 跟蹤當你處理美分,當與格式化字符串等

然後我恢復爲小數 - 相同的格式所有的時間,我可以很容易地轉換金額如果需要,我會得到不同的舍入算法。我對小數更滿意。

爲了解決小數不準確的問題 - 當使用谷歌搜索時,您可能會注意到大多數錯誤都與將小數轉換爲浮點數有關:) 由於前面已經提到vise,浮動數據不準確,您永遠也不應該將你的小數轉換爲浮點數。在處理小數時,這是您必須記住的最重要的一件事 - 您不想因轉換而失去準確性。 哦,我從來沒有遇到任何錯誤與紅寶石1.8.7,1.8.7和1.9.1廣泛使用BigDecimal。

+6

+1「永遠不會將您的小數轉換爲浮點數」......奇怪的事情發生了 – tybro0103 2012-02-03 04:46:46

10

這取決於。

如果您正在爲採購價格執行計算,請使用小數。
如果您正在執行工程數學,請使用浮點數。
如果您只是存儲數據,請使用字符串。

52
add_column :table, :price, :decimal, :precision => 8, :scale => 2 

上面的代碼將是您最好的選擇。

+0

我該如何在命令行中執行該操作?我輸入「rails generate scaffold Product price:decimal」,它創建了一個列:scale 1. – 2010-06-17 17:43:33

+2

根據您的需要,您可能需要添加 - > add_column:table,:currency,:string,:default =>'USD ' – Tom 2010-06-17 17:43:49

+0

這是Rails 3嗎? rails g migration AddPriceToYourModel price:decimal然後轉到生成的遷移並添加細節。 – Tom 2010-06-17 17:45:33

7

如果可能,我建議使用整數作爲價格。許多流行的寶石(如ActiveMerchant,Money)假設使用整數,通常最好將度量單位存儲在基本單位(如美分)中。

+0

但整數沒有13.25? – 2010-06-17 18:51:38

+4

這就是爲什麼你以美分爲基礎。所以13.25美元在數據庫中被存儲爲1325。您在視圖中格式化美元符號和小數點。 – sosborn 2010-06-17 23:32:25

+1

除非你正在計算使用一分錢的東西的價格,例如天然氣價格。然後你應該有兩個字段 - 一個用來存儲小數部分作爲整數,另一個用來告訴你第一個數字應該有多少個小數位......哦,等等,這是愚蠢的,只用一個小數:) – MikeJ 2013-07-30 13:58:51

10

花車是不準確的:

0.3 - 0.2 - 0.1 
=> -2.77555756156289e-17 

不要使用它們,除非你只存儲值。

如果您需要進行計算將價格以美分作爲整數存儲。您可以使用助手輕鬆地將它們顯示爲美元。

+2

omg that really發生。 – jturolla 2013-01-06 20:34:08

+2

它只是一個精細的東西。價值沒有問題。 -2.7 * 10^-17非常接近於零 – 2014-03-11 14:20:14

相關問題