0

Rails 3.0.3 を使用して、MySQL データベースに緯度と経度を保存しています。テーブルの作成に使用した移行の一部を次に示します (指定された精度の 10 進数値に注意してください)。

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 の 10 進数の精度 != BigDecimal の精度) がmy_value、データベースに書き込む前に BigDecimal の精度を制限して、データベースの制約を確実に尊重する方法を誰か教えてもらえますか?

ありがとう!

4

2 に答える 2

4

mySQL では、これらの地理座標を格納するために FLOAT を使用します。それらを高精度の 10 進数として格納しても意味がありません。緯度の 1/60 度は海里であるため、1 フィート (~ 1/3 メートル) は約 3 マイクロ度であることに注意してください。(3e-06)

IEEE 単精度浮動小数点のイプシロン (エラー) は約 6e-08 です。

GPS とジオコーディングは、179.9996 度にいる場合でも、それほど詳細ではありません。

非常に詳細な 200 縮尺のトポ マップなどを作成している場合は、ユニバーサル横メルカトル図法やランバート法などの高精度投影法を使用する必要があることをおそらく既にご存じでしょう。球体としての地球。しかし、ストア ファインダー タイプのアプリを実行している場合、そのような精度は必要ありません。

Ruby プログラムで 10 進数を使用する必要がある場合は、mySQL に格納する前に float に変換してください。

これは、Randall Munroe による地理座標の精度の説明です。

ここに画像の説明を入力

于 2011-01-20T23:34:02.913 に答える
0

私は何かを試してみます

new_value = number_with_precision(your_value.to_f, :precision => 13)
于 2011-01-21T08:09:34.537 に答える