这纯粹是出于好奇。
我做了这样的事:
public static void main(String args[]) throws Exception {
System.out.println(Double.NaN==Double.NaN);
}输出为false。这不是应该返回true吗?
为什么会这样呢?
发布于 2013-01-30 12:52:02
来自Java Language Specifications
浮点运算符不会产生任何例外(第11节)。溢出运算产生有符号无穷大,下溢运算产生非正规化值或符号零,没有数学确定结果的运算产生NaN。因此,所有以NaN作为操作数的数值操作都会产生NaN。如前所述,NaN是无序的,因此,涉及一个或两个NaNs的数值比较操作返回false,any != NaN返回true,包括x为NaN时的x!=x。
这里的重要一句话是:
因此,涉及一两个NaNs的数字比较操作返回false。
发布于 2013-01-30 12:58:11
为了比较两双,更好地使用#compareTo(Double)方法,它能够以分离的方式处理NaN和XXX_INFINITY。
对两个双对象进行数值比较。当应用于原始双值时,该方法执行的比较与Java语言数值比较操作符(<、<=、==、>=、>)执行的比较有两种不同之处: 此方法认为Double.NaN等于它自己,并且大于所有其他双值(包括Double.POSITIVE_INFINITY)。该方法认为0.0d大于-0.0d。这确保了该方法所施加的双对象的自然排序与相等。
public static void main(String[] args) {
Double d = new Double(Double.NaN);
System.out.println(d.compareTo(Double.NaN) == 0);//returns true
}https://stackoverflow.com/questions/14604458
复制相似问题