我有一個價格字段/列(例如15.50美元),我不知道Rails數據類型應該是字符串,小數還是浮點數?價格字段的字符串,十進制或浮點數據類型?
回答
這個參數總是有兩面 - 小數和整數。整數支持者認爲小數可能不準確(在進行轉換時),並且BigDecimal實現包含錯誤,有時甚至是段錯誤。
對於我自己的項目,我也選擇了整數,將它們包裹在一個自定義容器中,將美分轉換爲「真實」數額並返回。起初,它似乎很好,過了一段時間它變得非常繁瑣 - 跟蹤當你處理美分,當與格式化字符串等
然後我恢復爲小數 - 相同的格式所有的時間,我可以很容易地轉換金額如果需要,我會得到不同的舍入算法。我對小數更滿意。
爲了解決小數不準確的問題 - 當使用谷歌搜索時,您可能會注意到大多數錯誤都與將小數轉換爲浮點數有關:) 由於前面已經提到vise,浮動數據不準確,您永遠也不應該將你的小數轉換爲浮點數。在處理小數時,這是您必須記住的最重要的一件事 - 您不想因轉換而失去準確性。 哦,我從來沒有遇到任何錯誤與紅寶石1.8.7,1.8.7和1.9.1廣泛使用BigDecimal。
這取決於。
如果您正在爲採購價格執行計算,請使用小數。
如果您正在執行工程數學,請使用浮點數。
如果您只是存儲數據,請使用字符串。
add_column :table, :price, :decimal, :precision => 8, :scale => 2
上面的代碼將是您最好的選擇。
我該如何在命令行中執行該操作?我輸入「rails generate scaffold Product price:decimal」,它創建了一個列:scale 1. – 2010-06-17 17:43:33
根據您的需要,您可能需要添加 - > add_column:table,:currency,:string,:default =>'USD ' – Tom 2010-06-17 17:43:49
這是Rails 3嗎? rails g migration AddPriceToYourModel price:decimal然後轉到生成的遷移並添加細節。 – Tom 2010-06-17 17:45:33
如果可能,我建議使用整數作爲價格。許多流行的寶石(如ActiveMerchant,Money)假設使用整數,通常最好將度量單位存儲在基本單位(如美分)中。
花車是不準確的:
0.3 - 0.2 - 0.1
=> -2.77555756156289e-17
不要使用它們,除非你只存儲值。
如果您需要進行計算將價格以美分作爲整數存儲。您可以使用助手輕鬆地將它們顯示爲美元。
omg that really發生。 – jturolla 2013-01-06 20:34:08
它只是一個精細的東西。價值沒有問題。 -2.7 * 10^-17非常接近於零 – 2014-03-11 14:20:14
- 1. 十六進制字符串與浮點數浮動
- 2. 不會將字符串格式的十進制數字轉換爲浮點數
- 3. 浮點十六進制字符串返回浮動
- 4. Sitecore Profile.Score(字符串,浮點數)存在十進制值問題
- 5. 字符串將不允許浮點/十進制數
- 6. 將十六進制字符串轉換爲IEEE 754浮點數
- 7. 轉換IEEE 754浮點數以十六進制字符串
- 8. Mongodb解析字符串爲十進制/浮點數
- 9. Javascript - 十進制字符串的十六進制字符串
- 10. 價格字符串浮動
- 11. 浮點數字 - SAS十進制問題
- 12. 浮點到C中沒有十進制值的字符串#
- 13. 申請十進制格式爲十進制的字符串+數字的句子
- 14. 帶十進制的格式字符串
- 15. 十六進制值的字符串格式爲十六進制數字排序
- 16. 將浮點數向量轉換爲十六進制/二進制字符串
- 17. 十進制數字符串轉換爲十六進制的字符串
- 18. Base36字符串的NSData或十六進制字符串
- 19. WinRT十進制字符串格式化
- 20. 十進制字符串格式截斷零留給小數點
- 21. 雙十進制字符串
- 22. 字符串到十進制
- 23. 輸入字符串格式不正確(十進制字符串)
- 24. 十六進制字符到實際十六進制字符的字符串
- 25. 十進制字符串到字符
- 26. 將字符串轉換爲浮點或雙精度值更改十進制值
- 27. 訪問添加十進制類型的字段(數字字段大小十進制)
- 28. 使用數據類型轉換浮點的字符串
- 29. 字符串的十進制數用C
- 30. INT字段 - 字符串或二進制數據將被截斷
+1「永遠不會將您的小數轉換爲浮點數」......奇怪的事情發生了 – tybro0103 2012-02-03 04:46:46