Java 为什么这个比较返回false?

Java 为什么这个比较返回false?,java,Java,可能重复: 这纯粹是出于好奇 我是这样做的: public static void main(String args[]) throws Exception { System.out.println(Double.NaN==Double.NaN); } 输出为false。这不应该返回true 为什么会这样?来自: 浮点运算符不产生任何异常(§11)。手术 溢出会产生一个有符号的无穷大,这是一个 下溢产生非规范化值或有符号零,以及 没有数学上确定结果的运算产生NaN。全

可能重复:

这纯粹是出于好奇

我是这样做的:

public static void main(String args[]) throws Exception {
        System.out.println(Double.NaN==Double.NaN);
    }
输出为
false
。这不应该返回
true

为什么会这样?

来自:

浮点运算符不产生任何异常(§11)。手术 溢出会产生一个有符号的无穷大,这是一个 下溢产生非规范化值或有符号零,以及 没有数学上确定结果的运算产生NaN。全部的 以NaN作为操作数的数值操作将产生NaN作为结果。作为 已经描述过,NaN是无序的,因此进行数值比较 涉及一个或两个NAN的操作返回false和any= 涉及NaN的比较返回true,包括x=当x为NaN时为

这里重要的一句话是:

这是一个数字比较 涉及一个或两个NAN的操作返回false

从:

浮点运算符不产生任何异常(§11)。手术 溢出会产生一个有符号的无穷大,这是一个 下溢产生非规范化值或有符号零,以及 没有数学上确定结果的运算产生NaN。全部的 以NaN作为操作数的数值操作将产生NaN作为结果。作为 已经描述过,NaN是无序的,因此进行数值比较 涉及一个或两个NAN的操作返回false和any= 涉及NaN的比较返回true,包括x=当x为NaN时为

这里重要的一句话是:

这是一个数字比较 涉及一个或两个NAN的操作返回false


为了比较两个双精度,最好使用
#compareTo(Double)
方法,它能够以单独的方式处理
NaN
XXX_∞

在数值上比较两个双对象。这有两种方式 使用此方法进行的比较与使用 Java语言的数值比较运算符() 应用于基本双精度值时:

此方法认为Double.NaN等于自身和 大于所有其他双精度值(包括 双精度。正无穷大)。 此方法认为0.0d大于-0.0d。这确保了双对象的自然顺序由 方法与equals一致


为了比较两个双精度,最好使用
#compareTo(Double)
方法,它能够以单独的方式处理
NaN
XXX_∞

在数值上比较两个双对象。这有两种方式 使用此方法进行的比较与使用 Java语言的数值比较运算符() 应用于基本双精度值时:

此方法认为Double.NaN等于自身和 大于所有其他双精度值(包括 双精度。正无穷大)。 此方法认为0.0d大于-0.0d。这确保了双对象的自然顺序由 方法与equals一致


对于不比较浮点数是否相等的问题,请参见良好的解释。为了进一步解释,NaN基本上意味着这个数字不存在(不是一个数字)。不存在的东西等于零。例如,在数学中,你没有3/0=4/0(基本上是Nan=Nan)。这没有任何意义。关于不比较浮点数是否相等,请参阅好的解释。为了进一步解释,NaN基本上意味着这个数字不存在(不是一个数字)。不存在的东西等于零。例如,在数学中,你没有3/0=4/0(基本上是Nan=Nan)。这没有任何意义。
public static void main(String[] args) {
  Double d = new Double(Double.NaN);
  System.out.println(d.compareTo(Double.NaN) == 0);//returns true
}