【问题标题】:Equality operator returns true for unequal values相等运算符为不相等的值返回 true
【发布时间】:2017-05-07 04:29:32
【问题描述】:

我有两个变量 y 和 z 类型为 doublelong 。我的问题是相等运算符为它们返回 true,即使它们具有不相等的值,正如您在下面的代码 sn-p 中看到的那样。

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 少一个值,为什么 y==z 会实现

谁能解释一下这种行为。

【问题讨论】:

  • 尝试打印这些值?
  • 是的,它们都是不同的
  • 任何大于 2^53 - 1 的 long 值都不能精确地表示为 double。
  • 尝试打印(double) zy
  • 我很确定这里的某个地方也潜伏着一个副本:-)

标签: java operators core


【解决方案1】:

这里发生了两件事。

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

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

【讨论】:

    【解决方案2】:

    要评估 y == z,Java 必须将 z 提升为 double。

    任何大于 2^53 - 1 的 long 值都不能精确地用双精度表示。

    (double) Long.MAX_VALUE 确实等于(double) (Long.MAX_VALUE - 1),因为 double 没有足够的精度来区分这两个值。

    您可以使用Math.nextDown 查看所需的增量(如Long.MAX_VALUE - delta)以获取不同的浮点值:

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

    这产生 1024。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多