Java: двойной == и двойной равно - PullRequest
0 голосов
/ 06 марта 2019

Я запутался в нескольких вещах, связанных с использованием double.

  1. Если бы я инициализировал 2 двойных с одним и тем же литералом, == всегда будет иметь значение true? например, если следующие результаты верны, но я не знаю, случайно ли это:

    double a = .1d;
    double b = .1d;
    System.out.println(a==b);
    
  2. Я получаю тот же результат при использовании Double вместо double:

    Double a = .1d;
    Double b = .1d;
    System.out.println(a.equals(b));
    

Согласно документации Double, equals () возвращает true, если doubleValue () равны.

Таким образом, вопрос в том, является ли "==" для double и "equals ()" для Double гарантированно равным true для 2 переменных, инициализированных с использованием одного и того же литерала?

Когда они оценят ложь? Это когда задействованы арифметические операции?

Спасибо

1 Ответ

1 голос
/ 06 марта 2019

В общем случае == - это оператор, который проверяет равенство.Переменные объекта являются ссылками, поэтому он проверяет равенство ссылок или адресов.В случае примитивных типов данных, представляющих значения в памяти, это также означает, что он проверяет равенство значений.

Метод equals(~) проверяет равенство значений или содержимого.Вы используете его не для примитивных типов данных, а для объектов.

Это также относится и к double и Double.Проблема, которая возникает с двойными значениями, заключается в несоответствии значений, вызванных ошибками округления.

Некоторые арифметические операции могут обрабатывать округление по-разному, поэтому вы можете получить false для равенства значений, даже если считаете, что оно должно быть равным.

Следует отметить, что даже если правила округления немного противоречивы, арифметические операции являются детерминированными, поэтому несоответствие может быть обработано.

...