Сохранение координат из базового местоположения в базовых данныхFloat или Double? - PullRequest
8 голосов
/ 21 октября 2011

Я видел, как люди используют оба варианта ... Просто не знаю, не достаточно ли float для iOS5?

Ответы [ 4 ]

21 голосов
/ 21 октября 2011

32-разрядное число с плавающей запятой содержит 7 цифр точности, а 64-разрядное число с двойной точностью содержит 15 цифр точности.

С точностью до 7 цифр максимальная долгота 179,9999 точна только до 0,0001 градуса. Степень составляет около 60 морских миль, поэтому 0,0001 градуса составляет около 10 метров (33 фута). Если вы хотите хранить более точные значения широт / долгот, вам нужно использовать двойное число (или целое число с фиксированной точкой).

4 голосов
/ 21 октября 2011

В наши дни это не имеет большого значения.

Double - это просто слот значения с плавающей запятой, который может содержать вдвое большую точность, чем стандартный float. Если вы не заставите его использовать число с плавающей запятой, компилятор Objective-c будет фактически хранить все значения с плавающей запятой как двойные.

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

2 голосов
/ 18 февраля 2014

В последнее время, я думаю, что проще хранить координаты в Базовых данных как NSValue в трансформируемом атрибуте:

[NSValue valueWithMKCoordinate:coordinate]

https://developer.apple.com/library/ios/documentation/MapKit/Reference/NSValue_MapKit_additions/Reference/Reference.html

2 голосов
/ 15 января 2014

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

Наихудшая точность при сохранении в виде десятичных чисел для E / W и N / S:

  • поплавок: 1,6955566 метров
  • двойной: 3,1582203519064933E-9 метров.(Это 3 нм)

Вы можете сделать вычисления самостоятельно, запустив это на Java:

public class Main {
  public static void main(String[] args) {
    System.out.println(Math.ulp((float) 180) * 60 * 1852);
    System.out.println(Math.ulp((double) 180) * 60 * 1852);
  }
}

Я знаю, что это старая ветка, но я нашел еепока ищу проблему.Float, скорее всего, достаточно для большинства приложений.GPS данного устройства Apple, вероятно, не имеет лучшей точности, чем эта.Но хранить двойные данные проще, если данные не важны.

...