Координаты неточны при преобразовании в int

#java #android #google-maps #coordinates

#java #Android #google-карты #координаты

Вопрос:

Я получаю координаты Facebook для places, и они иногда имеют до 12 знаков после запятой. При преобразовании их в int (* 1E6) Я теряю точность, поскольку он сбривает некоторые цифры.

Например, double 59.313732591172 представлен как int 59313732.

Как я могу сохранить точность? Есть ли какой-нибудь способ сделать это на Android? Используя класс GeoPoint, я, кажется, застрял с int.

Майк

Комментарии:

1. Привет, Майк, кажется странным, что ты хочешь преобразовать свое местоположение в int… Double будет более точным, чем int. Можете ли вы объяснить, почему вам это нужно как int?

2. несмотря на то, что 12 десятичных знаков чрезвычайно точны… Я не делал математику, но я предполагаю, что 1E6 должно быть с точностью до метра или двух… Уверены, что это необходимо?

3. @travega: API Карт Google, который я использую, имеет класс под названием GeoPoint, который используется для точного определения местоположения: code.google.com/intl/sv/android/add-ons/google-apis/reference/… И он принимает только int в качестве аргументов. В каждом обсуждении в сети говорится о преобразовании double в int с использованием * 1E6, но я испытываю некоторые проблемы с этим.

4. @WarrenFaith: Точность находится где угодно от идеальной (= когда бритье не выполняется) до довольно низкой (=наиболее вероятно, когда сбриваются обе координаты). Я не проводил никаких расчетов, чтобы понять, что это именно означает. НО … мне только что пришло в голову, что вы, возможно, правы. Эти последние цифры достаточно близки, и результаты, которые я вижу, скорее из-за плохих тестовых данных. Я проверю это и опубликую свои выводы здесь.

5. @WarrenFaith: Да, похоже, это неверные данные. Спасибо, что предупредили.

Ответ №1:

int Будет содержать только целые числа, поэтому вы видите поведение, о котором вы просите.

 59.313732591172 * 1E6 = 59313732.591172

(int)59313732.591172 = 59313732
  

Если вам нужно сохранить больше цифр, либо продолжайте использовать double, преобразуйте в long вместо int и умножьте на большее число (например, 1E12)

Именно так работает преобразование с плавающей запятой в int / long на любом типизированном языке. Здесь это функция Java, и ничего специфичного для Android.

Комментарии:

1. Я знаю. Проблема в том, что API, который я использую (класс GeoPoint: code.google.com/intl/sv/android/add-ons/google-apis/reference /… ) принимает только int в качестве аргументов.

2. Ах. Плохой Google. Добавление 0,5 перед приведением к int, вероятно, лучшее, что вы можете сделать (чтобы правильно округлить вверх / вниз). В качестве дополнительного примечания, когда я использовал Facebook events, я обнаружил, что поиск адреса улицы кажется более точным, чем использование ссылок GPS. Возможно, они вводят данные для предотвращения кражи данных (по этой причине некоторые автомобильные системы GPS имеют испорченные карты). Однако грубый расчет показывает, что микродегрессор с точностью примерно до 10 см (окружность в км * 1000 / (360x1e6)), поэтому я бы послушал Уоррена. Было бы неплохо отредактировать вопрос, чтобы сосредоточиться на геопункте, чтобы избежать повторения в комментариях.

Ответ №2:

int слишком короткое для некоторых чисел (на самом деле, для большинства чисел), поскольку оно имеет только 32 бита. Используйте long вместо этого. Смотрите здесь