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 决定忽略其余数字。

是什么决定了这个数字可以或应该在三位数之后被砍掉?有什么可以控制的吗?浮动是存储它的正确类型吗?

我想要一个 6 的精度,永远不会更高,但可以更少,或者填充。因此,当51.7780提供时,它可能存储为51.778051.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 被描述为近似值

您可以改用小数,并指定精度和小数位数:

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 回答