价格字段的字符串,十进制或浮点数据类型?

时间:2010-06-17 17:21:35

标签: sql ruby-on-rails database

我有一个价格字段/列(例如15.50美元),我想知道Rails数据类型应该是字符串,小数还是浮点数?

5 个答案:

答案 0 :(得分:53)

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

上面的代码是你最好的选择。

答案 1 :(得分:45)

这个参数总是有两个方面 - 小数和整数。整数的支持者认为小数可能不准确(在进行转换时)并且BigDecimal实现包含错误,有时甚至是segfaulting。

对于我自己的项目,我也选择了整数,将它们包装在自定义容器中,将美分转换为“实际”金额并返回。起初它似乎很好,过了一段时间它变得非常麻烦 - 使用时跟踪美分,使用格式化字符串等时。

然后我恢复到小数 - 一直都是相同的格式,如果需要,我可以轻松地将金额转换为美分,我可以获得开箱即用的不同舍入算法。我对小数字更满意。

并解决有关小数不准确的问题 - 在谷歌搜索时你可能会注意到大多数错误都与将小数转换为浮点数有关:) 正如前面提到过的老虎钳,浮点数不准确,你永远不应该将你的小数转换成浮点数。这是处理小数时必须记住的最重要的事情 - 您不希望通过转换失去准确性。 哦,在广泛使用BigDecimal时,我从未真正遇到过ruby 1.8.7,1.8.7和1.9.1的任何错误。

答案 2 :(得分:11)

浮动不准确:

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

除非您只存储值,否则不要使用它们。

如果您需要进行计算,请将价格以美分存储为整数。您可以通过帮助将其轻松显示为美元。

答案 3 :(得分:10)

取决于。

如果您正在执行购买价格的计算,请使用小数 如果你正在进行工程数学,请使用浮点数 如果您只是存储数据,请使用字符串。

答案 4 :(得分:7)

如果可能的话,我建议使用整数作为价格。许多流行的宝石(例如ActiveMerchant,Money)都假设使用整数,并且通常最好将测量单位存储在基本单位(例如美分)中。