我想确保在Rails应用程序中存储产品价格时没有舍入问题。我应该使用什么mysql数据类型,它在rails中Map到什么?我想要10位小数的精确度。
b09cbbtk1#
我更喜欢将货币存储在数据库中作为最低面额的整数(便士,美分等),并对此进行计算。
add_column :product, :price, :integer
当然,您会希望任何表单输入和显示都是人们期望的形式,因此我们向模型添加一些帮助方法来帮助实现这一点。
class Product < ActiveRecord::Base def price_dollars self.price / 100 end def price_dollars=(val) self.price = val * 100 end end
在控制台中,我们得到:
> prod = Product.new => [snip] > prod.price_dollars = 12.93 => 12.93 > prod.price => 1293 > prod.price_dollars => 12.93 > prod.price = 1691 => 1691 > prod.price_dollars => 16.91
我敢肯定,可能有一个插件,处理这很好的地方。
mutmk8jj2#
听起来你想要:decimal列类型。您可以使用:precision和:scale选项控制总位数和小数位数:
:decimal
:precision
:scale
add_column :mytable, :mycolumn, :decimal, :precision => 30, :scale => 10
在本文档中有更多关于数据类型的内容。
sbtkgmzw3#
我认为在数据库中将最小公分母存储为整数总是最简单的(这里有一个我们使用美分的问题:Handling international currency input in Ruby on Rails,但是如果你喜欢的话,你可以用1/10,000美分存储价格),当你从数据库中取出数字时,做正确的数学运算。
wsxa1bj14#
加上道格拉斯的精彩回答:为了让它工作,至少在Ruby 2.1.4中,当除以100时,你需要将:price字段转换为浮点数或十进制。一个整数除以另一个整数
**1293 / 100
它不会返回你所期望的。Ruby返回整数12,而不是得到12.93。
2.1.4 :002 > 1293 / 100 => 12 2.1.4 :003 > 1293.to_f / 100 => 12.93
产品型号代码示例
class Product < ActiveRecord::Base def price_dollars self.price.to_f / 100 end def price_dollars=(val) self.price = val * 100 end end
7jmck4yq5#
使用“浮动”
add_column :customer, :amount, :float
5条答案
按热度按时间b09cbbtk1#
我更喜欢将货币存储在数据库中作为最低面额的整数(便士,美分等),并对此进行计算。
当然,您会希望任何表单输入和显示都是人们期望的形式,因此我们向模型添加一些帮助方法来帮助实现这一点。
在控制台中,我们得到:
我敢肯定,可能有一个插件,处理这很好的地方。
mutmk8jj2#
听起来你想要
:decimal
列类型。您可以使用:precision
和:scale
选项控制总位数和小数位数:在本文档中有更多关于数据类型的内容。
sbtkgmzw3#
我认为在数据库中将最小公分母存储为整数总是最简单的(这里有一个我们使用美分的问题:Handling international currency input in Ruby on Rails,但是如果你喜欢的话,你可以用1/10,000美分存储价格),当你从数据库中取出数字时,做正确的数学运算。
wsxa1bj14#
加上道格拉斯的精彩回答:
为了让它工作,至少在Ruby 2.1.4中,当除以100时,你需要将:price字段转换为浮点数或十进制。
一个整数除以另一个整数
**1293 / 100
它不会返回你所期望的。Ruby返回整数12,而不是得到12.93。
产品型号代码示例
7jmck4yq5#
使用“浮动”