Rails 3 Плавающая или десятичная для GPS-координат

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


person jac    schedule 14.06.2012    source источник


Ответы (4)


Если вам нужны более точные 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

Причина, по которой люди используют числа с плавающей запятой, заключается в том, что они обычно достаточно точны для большинства случаев использования и занимают меньше места для хранения.

person Peter Brown    schedule 15.06.2012
comment
@jac Пожалуйста, смотрите: http://www.ruby-forum.com/topic/208222 и почему десятичная дробь не решает вашу проблему. - person Anil; 15.06.2012
comment
@ Анил не уверен, что понимаю. Я использую это в своем приложении вместо поплавков для более точных координат GPS, и это работает именно так, как я ожидаю. - person Peter Brown; 15.06.2012

Поскольку экваториальная окружность Земли составляет около 40000 км, а долгота охватывает 360 градусов, отсюда следует, что вблизи экватора 1 градус эквивалентен около 110 км.

Таким образом:

  • Точность 0 цифр: ±110 км
  • Точность 1 цифры: ±11 км
  • 2-разрядная точность: ±1,1 км
  • 3-разрядная точность: ±110 м
  • 4-разрядная точность: ±11 м
  • 5-значная точность: ±1,1 м
  • 6-значная точность: ±11 см
  • 7-значная точность: ±1,1 см

Однако чем ближе вы приближаетесь к полюсам, тем меньше становятся длины параллелей. Например, недалеко от Парижа, который имеет широту 48 градусов, 1 градус соответствует cos(48) * 110 = 74 km.

Таким образом:

  • Точность 0 цифр: ±74 км
  • Точность 1 цифры: ±7,4 км
  • 2-разрядная точность: ±0,74 км
  • 3-разрядная точность: ±74 м
  • 4-разрядная точность: ±7,4 м
  • 5-разрядная точность: ±0,74 м
  • 6-значная точность: ±7,4 см
  • 7-значная точность: ±0,74 см

Итак, поля типа DECIMAL(10,7) было бы достаточно, чтобы удовлетворить вас достаточно точно.

person Paul T. Rawkeen    schedule 01.09.2012

Если вам нужна 100% точность с вашими десятичными знаками, умножьте на 10 ** n (где n — ваша желаемая точность) и сохраните как целое число.

Объекты с плавающей запятой представляют неточные действительные числа, используя представление с плавающей запятой двойной точности собственной архитектуры.

Видеть:

http://www.ruby-doc.org/core-1.9.3/Float.html
person Anil    schedule 15.06.2012

Как видно из ответа Пола, это зависит от вашего варианта использования.
Число с плавающей запятой обеспечивает точность примерно в 6 знаков после запятой.
±11 см вполне приемлемо, скажем, для адреса. и если вы отображаете адреса, маловероятно, что вы собираетесь выполнять какие-либо арифметические операции, которые усугубят ошибки округления.

person Emirikol    schedule 12.08.2013