Rails 3 Float or decimal for GPS coordinates

白昼怎懂夜的黑 提交于 2019-11-29 12:24:40

问题


I need to store GPS coordinates in a database. I've heard that floats are less accurate than decimals. Is that true? If so, what reason is there to ever use floats?


回答1:


If you want more accurate GPS coordinates, then yes decimals are the way to go. You can create them with a migration like:

create_table "models" do |t|
  t.decimal  "latitude", :precision => 15, :scale => 10, :default => 0.0
  t.decimal  "longitude", :precision => 15, :scale => 10, :default => 0.0
end

The reason people use floats is that they are usually precise enough for most use cases and use less space to store.




回答2:


Since Earth equatorial circumference is around 40000 km and longitude spans 360 degrees, it follows that near the equator 1 degrees is equivalent to about 110 km.

Thus:

  • 0 digit precision: ±110 km
  • 1 digit precision: ±11 km
  • 2 digit precision: ±1.1 km
  • 3 digit precision: ±110 m
  • 4 digit precision: ±11 m
  • 5 digit precision: ±1.1 m
  • 6 digit precision: ±11 cm
  • 7 digit precision: ±1.1 cm

However, the closer you move to the Poles, the smaller the lenghts of the parallels becomes. For example near Paris, which has a latitude of 48 degrees, 1 degree is equivalent to cos(48) * 110 = 74 km.

Thus:

  • 0 digit precision: ±74 km
  • 1 digit precision: ±7.4 km
  • 2 digit precision: ±0.74 km
  • 3 digit precision: ±74 m
  • 4 digit precision: ±7.4 m
  • 5 digit precision: ±0.74 m
  • 6 digit precision: ±7.4 cm
  • 7 digit precision: ±0.74 cm

So, field of type DECIMAL(10,7) would be enough to satisfy you rather precise.




回答3:


If you want 100% accuracy with your decimals, then multiply by 10**n(where n is your desired precision), and store as integer.

Float objects represent inexact real numbers using the native architecture's double-precision floating point representation.

See:

http://www.ruby-doc.org/core-1.9.3/Float.html



回答4:


As you can see in Paul's answer, it depends on your use-case.
A float provides a precision of roughly 6 decimal digits.
±11 cm is quite acceptable for, say, an address. and if you're displaying addresses it's unlikely that you are going to do any arithmetical operations that will compound rounding errors.



来源:https://stackoverflow.com/questions/11041818/rails-3-float-or-decimal-for-gps-coordinates

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!