我正在使用 Rails 3.0.3 在 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 的精度),但谁能告诉我在将my_value
BigDecimal 写入数据库之前如何限制它的精度以确保它尊重数据库约束?
谢谢!