2012-07-25 57 views
0

我創建一個3D地圖和我有X,Y和Z值的每個點,當前的數據庫,我得到的數據,從有像這樣的價值觀:Rails 3中 - 與存儲花車問題

x = -8.851079259998058e16 
y = 4.236944396687888e16 
z = -4.451352534647966e16 

我試圖做一個數據庫遷移,像這樣:

class CreateMapPoints < ActiveRecord::Migration 
    def change 
    create_table :map_points do |t| 
     t.float :x 
     t.float :y 
     t.float :z 
     t.timestamps 
    end 
    end 
end 

然而,當我把數據導入到這個新表並運行rails console下,我得到了奇怪的結果:

1.9.2-p290 :002 > MapPoint.first 
    MapPoint Load (0.6ms) SELECT `map_points`.* FROM `map_points` LIMIT 1 
=> #<MapPoint id: 1, x: -88510800000000000.0, y: 42369400000000000.0, z: -44513500000000000.0, created_at: nil, updated_at: nil> 

x,y和z缺少第一個數字之後的點。有人能告訴我在這裏做的不正確嗎?任何幫助,將不勝感激。

感謝

託尼

+0

你是如何導入數據的? – 2012-07-26 02:07:01

+0

我從一個CSV文件導入它 – 2012-07-26 09:31:16

+0

你是否在導入時進行任何'.to_f'調用?你可能會發送字符串,並讓其他東西將它們轉換爲浮動(並且一路上弄亂了一些東西)。 – 2012-07-26 09:37:32

回答

0

您可能需要設置遷移中的精度,如果浮動不工作,然後嘗試十進制:

t.decimal :x, :precision => 15 
t.decimal :y, :precision => 15 
t.decimal :z, :precision => 15 
1

它不是從你的問題不清楚是什麼實際的問題是。您說這些數值「在第一位數字後缺少點」。但是,顯示的值與輸入值大致相同。他們只是代表不同。該點是顯示格式的一個特徵,而不是數字的一個特徵。例如,「1/2」,「.5」和「5e-1」是相同值的不同表示。一個人擁有「/」,一個擁有「。」,而另一個擁有「e」這個事實並不能使他們擁有不同的數字。

-8.851079259998058e16與-88510800000000000.0大致相同。 (最後的「e16」表示乘以10 。)但是,它不同於第六位有效數字之後。所以存在這種差異是否真實以及是否存在問題的問題。

通過這種差異是否真實,我的意思是我想知道字符串「-88510800000000000.0」是否完全顯示計算機中的實際值。這可能是,格式化輸出時,只顯示前六位有效數字。在某些軟件中,默認輸出格式可能只顯示少量有效數字,並且可能通過對格式設置進行一些修改來顯示更多數字。您也可以使用指數格式指定顯示,如您所示的輸入值。這將涉及您正在使用的特定軟件,我無法進一步提供建議。

如果實際值已更改,而不僅僅是顯示它,那麼您可能需要使用更精確的類型,例如雙精度二進制浮點類型或擴展或任意精度十進制類型。同樣,備用類型的可用性涉及您正在使用的特定軟件,我不能進一步提供建議。