Двойное сравнение не удалось в Java - PullRequest
0 голосов
/ 11 апреля 2020

Почему первый if-statement возвращает true, а второй false?

Разве 100000000000000.032 в первом if-statement также не превратился в новый дубль, отличный от dd?

Double dd = 100000000000000.032;
if(dd == 100000000000000.032) {
    System.out.println("gaga");
}

Double ee = 100000000000000.032;
if(dd == ee) {
    System.out.println("gaga");
}

Ответы [ 5 ]

2 голосов
/ 11 апреля 2020

Поскольку вы сравниваете два объекта во втором if-statement, вы должны использовать метод equals следующим образом:

if(dd.equals(ee))
1 голос
/ 11 апреля 2020

В первом случае: - вы используете == для проверки объекта с примитивом; объект преобразуется в примитив и оба равны. Во втором if: - вы сравниваете два разных объекта.

Попробуйте ee == ee и увидите, что он возвращает true.

0 голосов
/ 11 апреля 2020

Либо вы следуете Маджеду Бадави ответу , чтобы использовать equals(), потому что вы сравниваете экземпляры объектов, либо вы изменяете свой код, как показано ниже:

double dd = 100000000000000.032
if( dd == 100000000000000.032 ) 
{
    System.out.println( "gaga" );
}

double ee = 100000000000000.032;
if( dd == ee ) 
{
    System.out.println( "gaga" );
}

Обратите внимание, что dd и ee теперь имеют примитивный тип double (со строчной буквой D).

В вашем примере первое сравнение работало, потому что внутренне оно интерпретировалось как:

… 
if( dd.doubleValue() == 100000000000000.032 ) 
…

Это поведение называется «Autoboxing / -unboxing» и было введено с Java 5; для версий до Java 5 ваш код вообще не будет компилироваться.

0 голосов
/ 11 апреля 2020

== проверяет, являются ли объекты одним и тем же объектом, но не имеют ли они одинаковое значение. В вашем примере dd и ee являются различными объектами, даже если они имеют одинаковое значение. Поэтому, если вы хотите сравнить их значения, вам нужно использовать метод equals .

. Вот небольшой тест, который поможет вам разобраться с этим:

package stackoverflow;

import org.junit.jupiter.api.Test;

public class QuickTest {

    @Test
    public void test() throws Exception {
        Double number1 = 100000000000000.032;
        Double number2 = 100000000000000.032;

        System.out.println("Do they point to the same object? " + (number1 == number2));

        System.out.println("Are they equal, do they have the same value? " + (number1.equals(number2)));

        Double number3 = 100000000000000.032;
        Double number4 = number3;

        System.out.println("Do they point to the same object? " + (number3 == number4));

        System.out.println("Are they equal, do they have the same value? " + (number3.equals(number4)));
    }
}

Это распечатывает следующее:

Do they point to the same object? false
Are they equal, do they have the same value? true
Do they point to the same object? true
Are they equal, do they have the same value? true
0 голосов
/ 11 апреля 2020

Double - это объект, поэтому == не даст требуемого результата, используйте метод .equals

...