将BigDecimal保存到数据库中的十进制字段会使BigDecimal不同

时间:2011-06-20 12:39:43

标签: ruby-on-rails ruby floating-point bigdecimal

我一直认为你不应该使用浮动数据来节省资金。所以我使用小数。问题是我保存十进制100并将其作为99.9999

放入数据库

我有一个名为GameCommission的模型

迁移:

create_table :game_commissions, :force => true do |t|
  t.integer :game_id
  t.integer :widget_id
  t.integer :user_id
  t.decimal :amount, :precision => 6, :scale => 4, :default => 0
  t.date :end_date
  t.timestamps
end

现在我快速制作一个新的GameCommission:

amount = BigDecimal.new("100")
gc = GameCommission.new(:game_id => 1, :widget_id => 1, :user_id => User.last.id, :amount => amount, :end_date => Date.today)
gc.save
gc.amount.to_s
# => "100

金额现在是100,这就是我想要的。但是,如果我再次获取它,金额将更改为99.9999,这也是数据库中保存的金额....

gc = GameCommission.last
gc.amount.to_s
# => "99.9999"

有人知道发生了什么事吗?

2 个答案:

答案 0 :(得分:6)

您在:precision => 6, :scale => 4字段中使用了值:amount,导致100缩小为99.9999,因为3个数字为100加上4个强制小数places = 7,大于6。

:precision => 6, :scale => 4可以存储来自-99.9999 to 99.9999的数字,这就是缩小100的原因。

:precision更改为7,您应该好好去。

答案 1 :(得分:0)

您使用的:amount类型是什么?根据{{​​3}},没有这样的东西,但 :decimal类型,听起来应该可以解决问题。