Я храню несколько широт и долгот в базе данных MySQL с помощью Rails 3.0.3. Вот часть миграции я использовал для создания таблицы (обратите внимание, десятичное значение с заданной точностью):Ruby BigDecimal и несоответствие точности десятичной точности MySQL
create_table :dummies do |t|
t.decimal :something, :precision => 13, :scale => 10
end
В следующем примере RSpec должен иллюстрировать, где это происходит не так.
Я использую BigDecimal для некоторых вычислений, а полученный my_value
- это число с большой точностью (больше, чем указано в миграции). Я сохраняю объект в базе данных и снова загружаю его.
Сравнивая исходное значение со значением базы данных не удается, поскольку их точность не является не то же самое, так что больше не тот же номер:
it 'should be equals before and after save' do
my_value = BigDecimal('4.123456789') * 5000 # more precise than defined in the migration
dummy = Dummy.new(:something => my_value)
location.save!
Dummy.first.something.should == dummy.something
end
Я понимаю, почему это происходит (точность десятичной в MySQL ! = BigDecimal), но может ли кто-нибудь сказать мне, как я могу ограничить точность файла BigDecimal my_value
, прежде чем я напишу его в базу данных, чтобы убедиться, что он соблюдает ограничения базы данных?
Спасибо!
Спасибо Олли. Проблема в том, что я использую координату для вычислений позже, поэтому я пошел с BigDecimal, думаю, что Floats могут возвращать странные значения здесь, не так ли? Я попробую ваше последнее решение, конвертируя его в поплавки до проверки. – Cimm
@Cimm - поплавки будут отлично работать для этих вычислений. Шутки в сторону. –
Еще раз спасибо! Я пошел на 't.float: latitude,: limit => 51', это использует Float в Rails и сохраняет значение как Double в MySQL. – Cimm