Сохранение BigDecimal в десятичном поле в базе данных делает BigDecimal другим - PullRequest
1 голос
/ 20 июня 2011

Я всегда думал, что вы никогда не должны использовать поплавки для экономии денег в базе данных. Поэтому я использовал десятичную. Проблема в том, что я сохраняю десятичную 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

Теперь я быстро создаю новую игровую комиссию:

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 ]

6 голосов
/ 20 июня 2011

Вы используете значения :precision => 6, :scale => 4 в своем поле :amount, в результате чего 100 будет уменьшено до 99.9999, так как 3 цифры 100 плюс 4 обязательных десятичных знака = 7, что больше 6.

:precision => 6, :scale => 4 может хранить число от -99.9999 to 99.9999, поэтому значение 100 уменьшается.

Измените :precision на 7, и вам пора идти.

0 голосов
/ 20 июня 2011

Что это за тип :amount, который вы используете? Согласно документации Rails , такой вещи нет, но есть типа a :decimal, который, похоже, решит проблему.

...