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

时间:2013-02-12 16:18:49

标签: ruby-on-rails floating-point rails-activerecord

我有一个使用浮点来存储地理位置的模型。它使用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决定省略其余数字的原因。

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

我想要一个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

1 个答案:

答案 0 :(得分:0)

显然,MySQL是问题,因为float被描述为approximated value

您可以改为使用小数,并指定精度和比例:

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