Мне нужно хранить координаты GPS в базе данных. Я слышал, что числа с плавающей запятой менее точны, чем десятичные. Это правда? Если да, то какая причина когда-либо использовать поплавки?
Rails 3 Плавающая или десятичная для GPS-координат
Ответы (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
Причина, по которой люди используют числа с плавающей запятой, заключается в том, что они обычно достаточно точны для большинства случаев использования и занимают меньше места для хранения.
http://www.ruby-forum.com/topic/208222
и почему десятичная дробь не решает вашу проблему.
- person Anil; 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)
было бы достаточно, чтобы удовлетворить вас достаточно точно.
Если вам нужна 100% точность с вашими десятичными знаками, умножьте на 10 ** n (где n — ваша желаемая точность) и сохраните как целое число.
Объекты с плавающей запятой представляют неточные действительные числа, используя представление с плавающей запятой двойной точности собственной архитектуры.
Видеть:
http://www.ruby-doc.org/core-1.9.3/Float.html
Как видно из ответа Пола, это зависит от вашего варианта использования.
Число с плавающей запятой обеспечивает точность примерно в 6 знаков после запятой.
±11 см вполне приемлемо, скажем, для адреса. и если вы отображаете адреса, маловероятно, что вы собираетесь выполнять какие-либо арифметические операции, которые усугубят ошибки округления.