为什么我的浮点在Rails中舍入?

Why is my floating point rounded in Rails?

我有一个使用浮点存储地理位置的模型。它使用ActiveRecord和Rails 3.2.x将数据存储在MySQL中。

1
2
3
4
5
6
7
8
c = Camping.new()
c.latitude=51.77802459999999
c.save
c.latitude
=> 51.77802459999999
c.reload
c.latitude
=> 51.778

在数据库中查找时,我确认它存储为51.778。其他数字的存储精度更高,我认为0是ActiveRecord或MySQL决定忽略其余数字的原因。

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

我想要一个6的精度,永远不会多,但可以少,或加垫。因此,当提供51.7780时,它可以存储为51.778051.778000。当提供51.77802459999999时,它可以存储为51.778025或完全精确的数字,我不在乎。

schema.rb相关部分:

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


显然,MySQL是个问题,因为float被描述为一个近似值。

您可以改用十进制,并指定精度和比例:

1
2
3
4
5
create_table"campings", :force => true do |t|
  #...
  t.decimal   "latitude",  :precision => 15, :scale => 10
  t.decimal   "longitude", :precision => 15, :scale => 10
end