我使用Rails 3.0.3在MySQL數據庫中存儲了一些緯度和經度。下面是我用(與給定精度注意十進制值)創建表遷移的一部分: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之一),但任何人都可以告訴我,我怎麼才能限制my_value
BigDecimal的精度,然後再將它寫入數據庫,以確保它遵守數據庫約束?
謝謝!
感謝奧利。問題是我後來使用座標進行計算,所以這就是爲什麼我使用BigDecimal時,認爲Floats可能會在這裏返回奇怪的值,不是嗎?我會嘗試你最後的解決方案,在驗證之前轉換爲浮動。 – Cimm 2011-01-21 23:08:29
@Cimm - 對於這些計算,浮點數可以很好地工作。認真。 – 2011-01-23 01:43:37