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

Сравнение тех двух значений должно привести к "истинному":

53.9173333333333  53.9173
7
задан Matt 9 March 2015 в 11:59
поделиться

3 ответа

Если вы хотите, чтобы a = 1,00001 и b = 0,99999 были идентифицированы как равные:

return Math.abs(a - b) < 1e-4;

В противном случае, если вы хотите, a = 1.00010 и b = 1.00019 идентифицируются как равные, и оба a и b положительны и не огромны:

return Math.floor(a * 10000) == Math.floor(b * 10000);
// compare by == is fine here because both sides are integral values.
// double can represent integral values below 2**53 exactly.

В противном случае используйте truncate , как показано в Есть ли в java какие-либо функции для усечения double? :

BigDecimal aa = new BigDecimal(a);
BigDecimal bb = new BigDecimal(b);
aa = aa.setScale(4, BigDecimal.ROUND_DOWN);
bb = bb.setScale(4, BigDecimal.ROUND_DOWN);
return aa.equals(bb);
18
ответ дан 6 December 2019 в 06:02
поделиться

Наивно:

if(Math.abs(a-b) < 0.0001)

Однако это не будет работать корректно для всех значений. Фактически невозможно заставить его работать, пока вы используете double, потому что double реализовано в виде двоичных дробей и даже не имеет десятичных знаков.

Вам придется преобразовать ваши значения в String или BigDecimal, чтобы сделать значимые тесты на их десятичные знаки.

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

3
ответ дан 6 December 2019 в 06:02
поделиться

Спасибо. Я сделал это так:

double lon = 23.567889;
BigDecimal bdLon = new BigDecimal(lon);
bdLon = bdLon.setScale(4, BigDecimal.ROUND_HALF_UP);

System.out.println(bdLon.doubleValue());
0
ответ дан 6 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

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