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

Mic*_*per 1 ruby floating-point ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

现在我快速制作一个新的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
Run Code Online (Sandbox Code Playgroud)

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

gc = GameCommission.last
gc.amount.to_s
# => "99.9999"
Run Code Online (Sandbox Code Playgroud)

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

sia*_*ame 6

您正在使用的值:precision => 6, :scale => 4在你的:amount领域,从而导致100被缩小到99.9999为100的3位数字加4个强制小数位= 7,这是大于6.

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

:precision7,你应该好好去.