【发布时间】:2011-01-20 23:20:21
【问题描述】:
我使用 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 的精度写入数据库以确保它尊重数据库约束吗?
谢谢!
【问题讨论】:
标签: mysql ruby-on-rails-3 decimal precision bigdecimal