【问题标题】:Why is my floating point rounded in Rails?为什么我的浮点数在 Rails 中四舍五入?
【发布时间】:2013-02-12 16:18:49
【问题描述】:

我有一个使用浮点存储地理位置的模型。它使用 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

【问题讨论】:

  • 什么数据库,纬度的属性类型是什么?
  • 你能发布你的schema.rbsn-p campings_table 代码吗?
  • 数据库,如上所述是 MySQL。我将在几秒钟内发布架构。
  • 尝试双精度而不是浮点数
  • @RadBrad: double 不是 AR 类型,AFAIK。整数或小数是。

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


【解决方案1】:

显然,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

【讨论】:

  • 那里的存储和查找时间、索引或存储空间有什么缺点吗?对于我的小型应用程序来说,这无关紧要。但只是为了清楚起见。
  • 根据High Performance MySQL浮点数是faster。但是,它们并不可靠,所以我认为性能上的小幅提升并不值得。
  • 比较和基准测试:stackoverflow.com/questions/8514167/…
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多