2016-10-24 12 views
-2

У меня есть домен адреса, который имеет поле широты и долго, как BigDecimal и я использую ограничение масштаба, как 16. Я этот адресBigDecimal проблемы с длинными и широчайшими

550 Tremont St, Boston, MA 02116, USA 

его длинный и латами являются - 71.07126540000002 и 42.3438919

Долгота для этого адреса хранится в дБ как -71.0712654000000200. теперь мне нужно сравнить сохраненную долготу с любым новым запросом, чтобы проверить, существует ли уже долгота.

Я посылаю ту же долготу снова -71.07126540000002, но я не могу преобразовать ее в форму, сохраненную в db (-71.0712654000000200), прежде чем сравнивать, поскольку они длинны. того же адреса.

я попытался с помощью

BigDecimal a = new BigDecimal(-71.07126540000002) 
println a.setScale(16, RoundingMode.CEILING)​ // tried all other RoundingMode 

, но все дают ответ, как ни -71.0712654000000156 или -71,0712654000000157, но не получают -71.0712654000000200

Помощи!

+0

Мне кажется, что оба значения имеют 7 цифр точности, а остальное - просто ошибка. Круглые до 16 знаков после запятой не подходят, если у вас есть 15-16 цифр точности. –

+2

Сделайте это для точного представления: 'BigDecimal a = new BigDecimal (" - 71.07126540000002 ")'. У парных чисел нет точного представления для десятичной части. –

+0

Немного смешно искать точное совпадение. Цифры, которые вы указали, на несколько порядков меньше микрометра. По всем практическим причинам это одно и то же место. – Henry

ответ

1

Он должен быть использован

a.setScale(14, RoundingMode.HALF_UP) 

так как после 14-поз. нули не младшее

в конце будет -71.07126540000002

1

Вы также можете просто использовать BigDecimal обозначения:

-71.0712654000000200000g​.setScale(16) или ​-71.07126540000002000000G.setScale(16)

Оба результата в:

-71.0712654000000200

Другой вариант - установка настраиваемого MathContext.