Двойной Java против BigDecimal для широты / долготы - PullRequest
54 голосов
/ 20 июля 2011

При хранении широты / долготы, которые обычно имеют формат: 44.087585 (т.е. максимум 2 числа перед точкой и 6dp), мне нужно беспокоиться о больших десятичных числах?

Ответы [ 6 ]

141 голосов
/ 20 июля 2011

Использование double имеет достаточную точность для точного определения широты / долготы до дюймов для 6-7 десятичных знаков. В авиации, если используются десятичные градусы, они обычно идут по крайней мере до 7 десятичных знаков. В наших симуляциях НАСА данные широты и долготы удваиваются, тогда как все остальные ориентации и высоты плавают. Другими словами, 6-е десятичное место для высоты не является значительным, в то время как 6-е десятичное место для широты / долготы - с точностью до фута. Вы не должны использовать float для lat / lon, если вам нужна точность до полуфутов.

Вы можете поиграть в Google Планета Земля, чтобы увидеть, какую точность вы получаете, устанавливая маркеры и манипулируя последней десятичной цифрой.

24 голосов
/ 20 июля 2011

double должно быть хорошо для широты / долготы. BigDecimal становится более важным, когда вы начинаете манипулировать валютой или вам нужно больше контролировать точность.

6 голосов
/ 20 июля 2011

A double имеет достаточную точность для хранения этого. Однако при отображении для пользователей используйте строку формата, например %.6f, чтобы не выводить цифры мусора.

5 голосов
/ 20 июля 2011

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

3 голосов
/ 20 июля 2011

, если вы хотите контролировать нано-роботов в их нано-путешествиях с помощью нано-GPS - переходите к BigDecimal. в противном случае - достаточно float / double.

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

Наихудшая точность двойного хранения составляет около 3 нм.

Если вы хотите рассчитать его на Java:

Math.ulp((double) 180) * 60 * 1852

3.1582203519064933E-9

В качестве бонуса;наихудшая точность при хранении в поплавках составляет 1,7 метра.

...