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
}