System.out.println(" answer is " + (5.0==5L));
Это возвращает true
! Он должен вернуть значение false
, потому что сравниваются два разных типа. Несмотря на то, что double
сравнивается с значением long
!Почему 5.0 == 5L вернет мне истину?
System.out.println(" answer is " + (5.0==5L));
Это возвращает true
! Он должен вернуть значение false
, потому что сравниваются два разных типа. Несмотря на то, что double
сравнивается с значением long
!Почему 5.0 == 5L вернет мне истину?
Два операнда проходят через двоичное числовое продвижение согласно JLS section 5.6.2, чтобы перейти к одному типу для обоих операндов.
Правила как это:
- Если какой-либо из операндов имеет ссылочного типа, его подвергают конверсии распаковки (§5.1.8).
- примитивные преобразования Добавление новых (§5.1.2) применяется для преобразования одного или обоих операндов, как указано по следующим правилам:
- Если один из операндов имеет тип
double
, другой преобразуется вdouble
.- ...
- ...
Ваш второй операнд имеет тип double
, поэтому значение long
неявно преобразуется в double
, то два double
значения сравниваются - и они равны.
При сравнении long
с до double
с, long
повышается до double
, а затем два сравниваются. Поскольку оба равны пяти, результат равен true
.
Он возвращает true, потому что он сравнивает два типа «примитивных переменных». И если они имеют одинаковое значение, это работает.
Для сравнения, используя «==» на «объект переменных» возвращает истину, если ссылка на тот же объект, например
Object a = new Object();
Object b = a;
//then a==b is true
Но:
Object a = new Object();
Object b = new Object();
//then a==b is false
вкусах, но я на самом деле предпочитайте выражение, оценивающее значение true. Случается, что 'long' преобразуется в' double', а затем сравнение выполняется очевидным образом. – 5gon12eder
Поскольку они оба являются цифрами, и поскольку вы на самом деле ссылаетесь на сравнение в своем коде, Java предполагает, что вы хотите сравнить их как числа, преобразует длинные и пытается выполнить сравнение. Какой смысл иметь оператор, который компилирует ('double == long'), но возвращает постоянное значение (' false')? –
с использованием == operator with unboxing effect, вероятно, преобразует rvalue в тип lvalue. в вашем случае длинный конвертируется в двойное. Это также сообразительность компилятора. Подумайте о том, что вы хотели, если бы имело 5.6 == 5L – ha9u63ar