Подтвердить что ты не робот

Rails 3 Float или decimal для GPS-координат

Мне нужно сохранить GPS-координаты в базе данных. Я слышал, что поплавки менее точны, чем десятичные. Это правда? Если да, то в чем причина когда-либо использовать поплавки?

4b9b3361

Ответ 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 см вполне приемлемо, например, для адреса. и если вы показываете адреса, маловероятно, что вы собираетесь выполнять любые арифметические операции, которые будут создавать ошибки округления.