Подтвердить что ты не робот

Как сравнить два двойных значения в Java?

Простое сравнение двух двойных значений в Java создает некоторые проблемы. Давайте рассмотрим следующий простой фрагмент кода на Java.

package doublecomparision;

final public class DoubleComparision 
{
    public static void main(String[] args) 
    {
        double a = 1.000001;
        double b = 0.000001;

        System.out.println("\n"+((a-b)==1.0));
    }
}

Приведенный выше код, по-видимому, возвращает true, оценку выражения ((ab)==1.0) но это не так. Вместо этого он возвращает false потому что вычисление этого выражения равно 0.9999999999999999 которое фактически ожидалось равным 1.0 что не равно 1.0 следовательно, условие оценивается как логическое false. Каков наилучший и предлагаемый способ преодоления такой ситуации?

4b9b3361

Ответ 1

В принципе, вы не должны делать точные сравнения, вы должны сделать что-то вроде этого:

double a = 1.000001;
double b = 0.000001;
double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {...}

Ответ 2

Вместо использования удвоений для десятичной арифметики, используйте java.math.BigDecimal. Это приведет к ожидаемым результатам.

Для справки рассмотрим этот fooobar.com/questions/80048/...

Ответ 3

Вы можете использовать Double.compare; Он сравнивает два указанных двойных значения.

Ответ 4

        int mid = 10;
        for (double j = 2 * mid; j >= 0; j = j - 0.1) {
            if (j == mid) {
                System.out.println("Never happens"); // is NOT printed
            }

            if (Double.compare(j, mid) == 0) {
                System.out.println("No way!"); // is NOT printed
            }

            if (Math.abs(j - mid) < 1e-6) {
                System.out.println("Ha!"); // printed
            }
        }
        System.out.println("Gotcha!");

Ответ 5

double a = 1.000001;
double b = 0.000001;

System.out.println( a.compareTo(b) );

Возвращает:

  • -1: "а" численно меньше, чем "б".

  • 0: "а" равно "б".

  • 1: "а" больше, чем "б".

Ответ 6

Рассмотрим эту строку кода:

Math.abs(firstDouble - secondDouble) < Double.MIN_NORMAL

Возвращает значение firstDouble равно secondDouble. Я не уверен относительно того, сработает ли это в вашем конкретном случае (как отметил Кевин, выполнение любой математики для чисел с плавающей запятой может привести к неточным результатам), однако у меня возникли трудности при сравнении двух двойных, которые действительно были равны, и все же использование метода "CompareTo" не вернуло 0.

Я просто оставляю это на всякий случай, если кому-то нужно сравнить, чтобы проверить, действительно ли они равны, а не просто похожи.

Ответ 7

Просто используйте метод Double.compare() для сравнения двойных значений.
Double.compare((d1, d2) == 0)

double d1 = 0.0;
double d2 = 0.0;

System.out.println(Double.compare((d1,d2) == 0))  // true