Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么5.0==5L会返回一个true?_Java_Equality - Fatal编程技术网

Java 为什么5.0==5L会返回一个true?

Java 为什么5.0==5L会返回一个true?,java,equality,Java,Equality,这将返回true! 它应该返回一个false值,因为正在比较两种不同的类型。 即使将double与long值进行比较 将longs与doubles进行比较时,将long提升为double,然后对两者进行比较。由于两者都等于5,因此结果为true这两个操作数将按照进行二进制数字升级,以获得两个操作数的单一类型 规则如下: 如果任何操作数是引用类型,则它将进行取消装箱转换(§5.1.8) 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数: 如果任一操作数的类型为double,则

这将返回
true
! 它应该返回一个
false
值,因为正在比较两种不同的类型。
即使将
double
long
值进行比较

long
s与
double
s进行比较时,将
long
提升为
double
,然后对两者进行比较。由于两者都等于5,因此结果为
true

这两个操作数将按照进行二进制数字升级,以获得两个操作数的单一类型

规则如下:

  • 如果任何操作数是引用类型,则它将进行取消装箱转换(§5.1.8)
  • 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
    • 如果任一操作数的类型为
      double
      ,则另一个操作数将转换为
      double

第二个操作数的类型为
double
,因此
long
值隐式转换为
double
,然后比较两个
double
值,并且它们相等。

它返回true,因为它比较的是两种类型的“基本变量”。如果它们是相同的值,它就起作用了

相比之下,例如,如果引用的对象是同一个对象,则在“对象变量”上使用“==”返回true

System.out.println(" answer is " + (5.0==5L));
但是:


口味不同,但我实际上更喜欢这个表达而不是真的。现在发生的事情是将
long
转换为
double
,然后以明显的方式进行比较。因为它们都碰巧是数字,而且实际上是在代码中调用比较,所以Java假设您希望将它们作为数字进行比较,转换long并尝试进行比较。使用编译(
double==long
)但返回常量值(
false
)的运算符有什么意义?使用带有取消装箱效果的==运算符可能会将右值转换为左值类型。在您的情况下,long被转换为double。这也是关于编译器的智能性。想想如果had 5.6==5LIt返回
false
,您想要什么!可能是编译错误,但不是错误!
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