Сравнение тех двух значений должно привести к "истинному":
53.9173333333333 53.9173
Если вы хотите, чтобы 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);
Наивно:
if(Math.abs(a-b) < 0.0001)
Однако это не будет работать корректно для всех значений. Фактически невозможно заставить его работать, пока вы используете double
, потому что double
реализовано в виде двоичных дробей и даже не имеет десятичных знаков.
Вам придется преобразовать ваши значения в String
или BigDecimal
, чтобы сделать значимые тесты на их десятичные знаки.
Возможно, вы захотите прочитать Руководство по работе с плавающей точкой, чтобы лучше понять, как работают значения с плавающей точкой.
Спасибо. Я сделал это так:
double lon = 23.567889;
BigDecimal bdLon = new BigDecimal(lon);
bdLon = bdLon.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println(bdLon.doubleValue());