0

私は 3D マップを作成しており、各ポイントの x、y、および z 値を持っています。データを取得している現在のデータベースには、次のような値があります。

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 の最初の桁の後にポイントがありません。ここで私が間違っていることについて誰かがアドバイスできますか? どんな助けでも大歓迎です。

ありがとう

トニー

4

2 に答える 2

1

あなたの質問からは、実際の問題が何であるかは明らかではありません。あなたは、値が「最初の桁の後のポイントが欠落している」と言います。ただし、表示される値は入力値とほぼ同じです。それらは単に異なって表現されています。ポイントは表示形式の特徴であり、数値の特徴ではありません。たとえば、「1/2」、「.5」、および「5e-1」は、同じ値の異なる表現です。「/」、「.」、「e」があっても、数字が異なるわけではありません。

-8.851079259998058e16 は、-88510800000000000.0 とほぼ同じです。(末尾の「e16」は 10 16倍という意味です。) ただし、6 桁目以降は異なります。したがって、この違いが本当なのか、それが問題なのかという疑問があります。

この差が本当かどうかというと、「-88510800000000000.0」という文字列がコンピュータの実際の値を完全に表示しているかどうかということです。出力用にフォーマットするときに、最初の 6 桁の有効数字しか表示されなかった可能性があります。一部のソフトウェアでは、デフォルトの出力形式では数桁しか表示されない場合があり、形式設定を変更することでさらに多くの桁数を表示できる場合があります。入力値を示したように、指数形式を使用して表示を指定することもできます。これには、使用している特定のソフトウェアが含まれますが、それについてはこれ以上アドバイスできません。

値の表示だけでなく実際に値が変更された場合は、倍精度の 2 進浮動小数点型や拡張精度または任意精度の 10 進数型など、より正確な型を使用する必要がある場合があります。繰り返しますが、代替タイプの可用性は、使用している特定のソフトウェアに関係しており、これ以上アドバイスすることはできません.

于 2012-07-26T11:55:52.050 に答える
0

移行中に精度を設定する必要がある場合があります。float が機能しない場合は、decimal を試してください。

t.decimal :x, :precision => 15
t.decimal :y, :precision => 15
t.decimal :z, :precision => 15
于 2012-07-25T23:47:04.820 に答える