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?
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.
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
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.
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:
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:
So, field of type DECIMAL(10,7)
would be enough to satisfy you rather precise.