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)
上面的代码是你最好的选择.
Tan*_*ans 45
这个参数总是有两个方面 - 小数和整数.整数的支持者认为小数可能不准确(进行转换时)并且BigDecimal实现包含错误,有时甚至是segfaulting.
对于我自己的项目,我也选择了整数,将它们包装在一个自定义容器中,将美分转换为"真实"金额并返回.起初它似乎很好,过了一段时间它变得非常麻烦 - 使用时跟踪美分,使用格式化字符串等时.
然后我恢复到小数 - 一直是相同的格式,如果需要我可以很容易地将金额转换为美分,我得到了开箱即用的不同舍入算法.我对小数点更满意.
并且要解决关于小数不准确的问题 - 当谷歌搜索时你可能会注意到大多数错误都与将小数转换为浮点数有关:)正如前面提到过的老虎机,浮点数不准确你永远不应该将你的小数转换为浮动.这是处理小数时必须记住的最重要的事情 - 您不希望通过转换失去准确性.哦,我从来没有真正遇到任何与ruby 1.8.7,1.8.7和1.9.1的错误,同时广泛使用BigDecimal.
vis*_*ise 11
浮点不准确:
0.3 - 0.2 - 0.1
=> -2.77555756156289e-17
Run Code Online (Sandbox Code Playgroud)
除非您只存储值,否则不要使用它们.
如果您需要进行计算,则以美分为单位存储整数价格.您可以通过帮助将其轻松显示为美元.
如果可能,我建议使用整数作为价格.许多流行的宝石(例如ActiveMerchant,Money)都假定使用整数,并且通常最好将测量单位存储在基本单位(例如美分)中.