Rails 3 Float или decimal для GPS-координат
Мне нужно сохранить GPS-координаты в базе данных. Я слышал, что поплавки менее точны, чем десятичные. Это правда? Если да, то в чем причина когда-либо использовать поплавки?
Ответы
Ответ 1
Если вам нужны более точные GPS-координаты, тогда дамбы - это путь. Вы можете создать их с помощью миграции, например:
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
Причина, по которой люди используют float, состоит в том, что они обычно достаточно точны для большинства случаев использования и используют меньше места для хранения.
Ответ 2
Так как экваториальная окружность Земли составляет около 40000 км, а долгота охватывает 360 градусов, следует, что около экватора 1 градус эквивалентно около 110 км.
Таким образом:
- 0-разрядная точность: ± 110 км
- точность 1 разряд: ± 11 км
- двузначная точность: ± 1,1 км
- трехзначная точность: ± 110 м
- 4-значная точность: ± 11 м
- 5-значная точность: ± 1,1 м
- 6-разрядная точность: ± 11 см
- 7-значная точность: ± 1,1 см
Однако чем ближе вы переходите к полякам, тем меньше длины параллелей.
Например, около Парижа, ширина которого составляет 48 градусов, 1 градус эквивалентен cos(48) * 110 = 74 km
.
Таким образом:
- 0-разрядная точность: ± 74 км
- точность 1 разряд: ± 7.4 км
- Двузначная точность: ± 0,74 км
- трехзначная точность: ± 74 м
- 4-х разрядная точность: ± 7,4 м
- 5-значная точность: ± 0,74 м
- 6-разрядная точность: ± 7,4 см
- 7-значная точность: ± 0,74 см
Итак, поле типа DECIMAL(10,7)
было бы достаточно, чтобы удовлетворить вас довольно точным.
Ответ 3
Если вы хотите 100% -ную точность с десятичными знаками, затем умножьте на 10 ** n (где n - ваша желаемая точность) и сохраните как целое.
Объекты Float представляют неточные действительные числа, используя представление с плавающей запятой с двойной точностью на основе собственной архитектуры.
См:
http://www.ruby-doc.org/core-1.9.3/Float.html
Ответ 4
Как вы можете видеть в ответе Павла, это зависит от вашего прецедента.
Поплавок обеспечивает точность примерно 6 десятичных цифр.
± 11 см вполне приемлемо, например, для адреса. и если вы показываете адреса, маловероятно, что вы собираетесь выполнять любые арифметические операции, которые будут создавать ошибки округления.