2011-01-20 25 views
0

我使用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的精度,然後再將它寫入數據庫,以確保它遵守數據庫約束?

謝謝!

回答

4

在mySQL中,使用FLOAT來存儲這些地理座標。將它們作爲高精度小數存儲是沒有意義的。請記住,1/60度的緯度是海里,所以一英尺(約1/3米)約爲3微米。 (3E-06)

爲IEEE單精度浮點(錯誤)的小量約6E-08

GPS和地理編碼不是那麼詳細,甚至當你在179.9996度。

如果你正在製作高度詳細的200比例地形地圖或類似的東西,你可能已經知道你必須使用高精度的投影,如通用橫向墨卡託或蘭伯特等,因爲你超越了將地球近似爲球體的極限。但是,如果你正在做一個商店查找器類型的應用程序,那麼你不需要,也不需要,也不會那麼精確。

如果您必須在Ruby程序中使用十進制,請在存儲到mySQL之前轉換爲float。

+0

感謝奧利。問題是我後來使用座標進行計算,所以這就是爲什麼我使用BigDecimal時,認爲Floats可能會在這裏返回奇怪的值,不是嗎?我會嘗試你最後的解決方案,在驗證之前轉換爲浮動。 – Cimm 2011-01-21 23:08:29

+0

@Cimm - 對於這些計算,浮點數可以很好地工作。認真。 – 2011-01-23 01:43:37

0

我會嘗試像

new_value = number_with_precision(your_value.to_f, :precision => 13)