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

Чтобы исключить исключительное исключение индекса массива, следует использовать инструкцию расширенный- for , где и когда они могут.

Основная мотивация (и использовать), когда вы выполняете итерацию, и вам не требуются сложные шаги итерации. Вы не могли бы использовать расширенный for для перемещения назад в массиве или только для итерации на каждом другом элементе.

Вы гарантированно не исчерпали элементы для повторения при этом, а ваш [исправленный] пример легко конвертируется.

Код ниже:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
    System.out.print(name[i] + "\n");
}

... эквивалентен этому:

String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
    System.out.println(firstName + "\n");
}

1
задан JarsOfJam-Scheduler 17 January 2019 в 14:32
поделиться

1 ответ

Для больших расстояний используйте формулу Хаверсайна для точности. На коротких дистанциях Пифагор в два раза быстрее.

16 значащих цифр (тип данных DOUBLE) смешны. Вам не нужно различать двух разных блох на вашей собаке.

С Пифагором обязательно делите долготу на косинус широты - один градус долготы возле Хельсинки в два раза меньше, чем один градус на экваторе.

Еще несколько подробностей здесь: http://mysql.rjweb.org/doc.php/latlng

Если 1.6054631070094885 является разницей по широте, то подумайте об этом следующим образом : Если вы и я на одной долготе, но наши широты равны 1.605463 и 1.605464, то, ну, я не знаю вас достаточно хорошо, чтобы быть , что близко.

Невозможно сравнивать два значения с плавающей запятой без фактора выдумки:

If abs(a-b) < 0.00001, then treat them as equal.

Подробнее

Я рекомендую FLOAT для lat, lng и расстояние, так как вы говорите о ресторанах. Если вы говорите не более чем о, скажем, 100 милях или километрах, то это выражение достаточно точное:

SQRT(  ($lat - lat) *
       ($lat - lat) +
      (($lng - lng) * COS(RADIANS(lat))) *
      (($lng - lng) * COS(RADIANS(lat))) )  * $factor

Где ...

  • lat и lng являются именами FLOAT столбцов в таблице, в единицах градусов.
  • $lat и $lng - это значения местоположения, с которого вы начинаете, также в градусах. (PHP использует $; другие языки используют другие соглашения.)
  • $factor составляет 69,172 для миль или 111,325 для километров.
  • Я бы не отображал результат с более чем одним десятичным знаком. (Не показывать «12,345678 миль»; «12,3 миль» достаточно хорошо.)

Сравнение Пифагора и GCD:

             Pyt        GCD
To Rennes:  93.9407    93.6542
To Vannes:  95.6244    95.6241
0
ответ дан Rick James 17 January 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: