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

nev*_*ame 37 sql database ruby-on-rails

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

Tom*_*Tom 53

add_column :table, :price, :decimal, :precision => 8, :scale => 2
Run Code Online (Sandbox Code Playgroud)

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

  • 根据您的需要,您可能需要添加 - > add_column:table,:currency,:string,:default =>'USD' (2认同)

Tan*_*ans 45

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

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

然后我恢复到小数 - 一直是相同的格式,如果需要我可以很容易地将金额转换为美分,我得到了开箱即用的不同舍入算法.我对小数点更满意.

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

  • +1"永远不会将你的小数转换为浮点数"......奇怪的事情发生了 (6认同)

Woo*_*Moo 11

这取决于.

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


vis*_*ise 11

浮点不准确:

0.3 - 0.2 - 0.1
=> -2.77555756156289e-17
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它只是一个精确的事情.这个价值没有错.-2.7*10 ^ -17非常接近于零 (2认同)

Kev*_*tre 7

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

  • 这就是为什么你以美分为基础的原因.所以$ 13.25在数据库中存储为1325.您在视图中格式化美元符号和小数. (4认同)