Java: Проверьте, совпадают ли два двойных значения в определенном количестве десятичных знаков - PullRequest
7 голосов
/ 31 мая 2010

Сравнение этих двух значений приведет к «истине»:

53.9173333333333  53.9173

Ответы [ 5 ]

18 голосов
/ 31 мая 2010

Если вы хотите, чтобы 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? :

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);
6 голосов
/ 21 июня 2018

вот простой пример, если вам все еще нужно это :)

public static boolean areEqualByThreeDecimalPlaces(double a, double b) {

    a = a * 1000;

    b = b * 1000;

    int a1 = (int) a;

    int b1 = (int) b;

    if (a1 == b1) {
        System.out.println("it works");
        return true;
    }

    else
        System.out.println("it doesn't work");
    return false;
3 голосов
/ 31 мая 2010

Наивно:

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

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

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

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

2 голосов
/ 31 октября 2016

Общие Apache имеет это: org.apache.commons.math3.util.Precision равно (double x, double y, double eps)

epsilon будет расстояние, которое вы позволите. Похоже, у тебя будет 1е-5?

Исходный код этого метода выглядит так, как будто он использует Math.abs, как предлагается в других ответах.

0 голосов
/ 31 мая 2010

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

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

System.out.println(bdLon.doubleValue());
...