价格字段的string,小数或浮点数据types?

我有一个价格字段/列(例如15.50美元),我不知道Rails的数据types应该是string,小数还是浮点数?

这个说法总是有两个方面 – 小数和整数。 整数支持者认为小数可能不准确(在进行转换时),而且BigDecimal实现包含错误,有时甚至出现分段错误。

对于我自己的项目,我也拿起整数,把它们包装在一个自定义的容器中,将美分转换成“真实”的数额并返回。 起初,它似乎很好,过了一段时间,它变得非常繁琐 – 跟踪当你处理美分,格式化string等。

然后我回到小数 – 一直格式相同,如果需要,我可以很容易地将数额转换为美分,我得到不同的舍入algorithm。 我更加满意小数。

并解决关于小数不准确的问题 – 当使用谷歌search时,您可能会注意到大部分的错误都与将小数转换为浮点数有关:)作为前面已经提到的vise,浮点数是不准确的,你永远不应该将你的小数转换为浮动。 这是处理小数时必须记住的唯一最重要的事情 – 您不想因转换而失去准确性。 哦,我从来没有遇到任何错误与ruby1.8.7,1.8.7和1.9.1广泛使用BigDecimal。

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

上面的代码将是你最好的select。

这取决于。

如果您正在执行购买价格计算,请使用小数点。
如果你正在执行工程math使用浮动。
如果你只是存储数据使用一个string。

花车不准确:

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

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

如果您需要进行计算,以美分作为整数存储价格。 你可以很容易地显示他们作为美元与帮手。

我build议尽可能使用整数价格。 许多stream行的gem(如ActiveMerchant,Money)假定使用整数,通常最好将度量单位存储在基本单位(如美分)中。