2017-05-07 74 views
1

我有两个变量y和z,类型为doublelong。我的问题是相等运算符对它们返回true,即使它们具有不同的值,如下面的代码片段中所示。平等运算符对不等值返回true

public class Test { 
    public static void main(String[] args) throws Exception { 
     double y = (double) Long.MAX_VALUE; 
     System.out.println(y);//9.223372036854776E18 
     long z = Long.MAX_VALUE - 1; 
     System.out.println(z);//9223372036854775806 
     System.out.println(y == z);//=============true 
    } 
} 

我的查询是如果Z具有小于Y一个值,为什么ÿ== z为即将实现

有人可以解释这种行为。

+0

尝试打印这些价值观? – GhostCat

+0

是的,它们都不相同 –

+0

任何大于'2^53 - 1'的长整数值都不能完全表示为双精度值。 –

回答

4

这里发生了两件事。

  1. double == long,所述longpromoteddouble。表达式y == z的计算结果与(double) Long.MAX_VALUE == (double) (Long.MAX_VALUE - 1)相同。

  2. double只有53位精度。当将long> 2转换为double时,最低有效位将被舍入,使得(double) Long.MAX_VALUE(= 2 -1)和(double) (Long.MAX_VALUE - 1)成为相同的值。

4

评价y == z,Java有促进z为双。

大于2^53 - 1的任何长整数值都不能用double表示。

(double) Long.MAX_VALUE确实等于(double) (Long.MAX_VALUE - 1),因为双没有足够的精度明显代表了两个值。

你可以看到需要的增量(如Long.MAX_VALUE - delta)获得使用Math.nextDown不同的浮点值:

double delta = y - Math.nextDown(y); 

这将产生1024

+0

我的投票去这里的第一个答案:-) – GhostCat