2

フローティングポイントを使用してジオロケーションを保存するモデルがあります。ActiveRecord、Rails 3.2.xを使用して、データをMySQLに保存します。

c = Camping.new()
c.latitude=51.77802459999999
c.save
c.latitude
=> 51.77802459999999
c.reload
c.latitude
=> 51.778

データベースを見ると、51.778として保存されていることがわかります。他の数値はより正確に保存され0ます。ActiveRecordまたはMySQLのいずれかが残りを省略することを決定するのはこのためだと思います。

3桁の数字の後に数字を切り落とすことができる、または切り落とす必要があると判断するのは何ですか?これを制御するものはありますか?floatはこれを保存するための正しいタイプですか?

精度を6にしたいのですが、それ以上にすることはできませんが、それより低くすることも、パディングすることもできます。したがって、51.7780が提供されると、51.7780またはとして保存される場合があります51.778000。が提供されている場合、それは完全な精度で数値として、または数値として51.77802459999999格納できます。51.778025私は本当に気にしません。

からの関連部分schema.rb

  create_table "campings", :force => true do |t|
    #...
    t.float    "latitude"
    t.float    "longitude"
  end
4

1 に答える 1

1

どうやら、MySQL が問題で、float は近似値として記述されています。

代わりに decimal を使用して、精度と位取りを指定できます。

create_table "campings", :force => true do |t|
  #...
  t.decimal    "latitude",  :precision => 15, :scale => 10
  t.decimal    "longitude", :precision => 15, :scale => 10
end
于 2013-02-12T17:06:47.510 に答える