Какой тип данных MySQL следует использовать для широты / долготы с 8 десятичными знаками?

Я работаю с данными карты, а Latitude/Longitude до 8 знаков после запятой. Например:

 Latitude 40.71727401 Longitude -74.00898606 

Я видел в документе Google, который использует:

 lat FLOAT( 10, 6 ) NOT NULL, lng FLOAT( 10, 6 ) NOT NULL 

однако их десятичные знаки достигают 6.
Должен ли я использовать FLOAT(10, 8) или есть другой метод для хранения этих данных, чтобы он был точным. Он будет использоваться с расчетами карты. Благодаря!

DECIMAL – это тип данных MySQL для точной арифметики. В отличие от FLOAT его точность фиксируется для любого размера числа, поэтому, используя его вместо FLOAT, вы можете избежать ошибок точности при выполнении некоторых вычислений. Если вы просто сохраняли и извлекали числа без расчета, то на практике FLOAT был бы безопасен, хотя нет никакого вреда в использовании DECIMAL. С расчетами FLOAT по-прежнему в основном нормально, но абсолютно уверен в 8d.p. точность вы должны использовать DECIMAL.

Ширины варьируются от -90 до +90 (gradleусов), поэтому для этого подходит DECIMAL (10, 8), но долготы колеблются от -180 до +180 (в gradleусах), поэтому вам нужен DECIMAL (11, 8). Первое число – это общее количество сохраненных цифр, а второе – число после десятичной точки.

Короче говоря: lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL

Это объясняет, как MySQL работает с типами данных с плавающей запятой.

Кроме того, вы увидите, что значения float округлены.

 // например: заданные значения 41.0473112,29.0077011

 поплавок (11,7) |  десятичное (11,7)
 ---------------------------
 41.0473099 |  41.0473112
 29.0077019 |  29.0077011

Вы можете установить тип данных как целое число со знаком. Когда вы храните координаты в SQL, вы можете установить как lat * 10000000 и long * 10000000. И когда вы выбираете с расстоянием / радиусом, вы разделите координаты хранения на 10000000. Я тестировал его с 300K строк, время ответа на запрос хорошее. (2 x 2,67 ГГц, 2 ГБ оперативной памяти, MySQL 5.5.49)

Лучший способ в моем случае – сохранить координаты как DOUBLE.

 lat DOUBLE NOT NULL, lng DOUBLE NOT NULL 

Он сохранит всю ценность без округления.

Если вам нужно округлить значение, мой совет заключается в том, что это лечение выполняется в начале данных, например, в пользовательском интерфейсе.

Использование переноса rubyов на рельсах

 class CreateNeighborhoods < ActiveRecord::Migration[5.0] def change create_table :neighborhoods do |t| t.string :name t.decimal :latitude, precision: 15, scale: 13 t.decimal :longitude, precision: 15, scale: 13 t.references :country, foreign_key: true t.references :state, foreign_key: true t.references :city, foreign_key: true t.timestamps end end end 

Не используйте float … Он будет округлять ваши координаты, что приведет к некоторым странным событиям.

Использовать десятичную

  • Интерфейсы Java и типы возврата
  • Как определить применение Lisp в Haskell?
  • Преобразовать строку в тип C #
  • Когда использовать значения без знака над подписанными?
  • Производительность TypeCasting
  • Разница между и
  • Что такое декларации и деклараторы и как их типы интерпретируются стандартом?
  • Должен ли я использовать #include рядом с ?
  • Являются ли HLists не более чем сложным способом написания кортежей?
  • Преобразование hex в текстовое представление в десятичное число
  • Разница между типами string и char в C ++
  • Interesting Posts
    Давайте будем гением компьютера.