先看源码:
/**
* A constant holding a Not-a-Number (NaN) value of type
* {@code double}. It is equivalent to the value returned by
* {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
*/
public static final double NaN = 0.0d / 0.0;翻译过来:
NaN是一个常量,表示的是double类型的、非数字类型的值。
拓展:它相当于Double.longBitsToDouble(0x7ff8000000000000L)返回的值。
·
NaN只是一个固定的标志值,不是一个数;
NaN的意思就是: not a number;其实是说不是一个合理的实数,在合法但不合理的情况下避免你的程序出exception。
而且NaN什么都不是,不能比较, (NaN=NaN)=false。 这种东西没有什么大的意思,理解就好了。
NaN在Double中虽说是一个double类型的常量,但是两个 Double.NaN根本不能直接使用==、<、>这些比较符号去比较。(比较的结果一律为false。。。)
double naN1 = Double.NaN;
double naN2 = Double.NaN;
for (int i = 0; i < 10; i++) {
System.out.println(naN1==naN2);
}
double naN1 = Double.NaN;
double double3 = 3.05d;
for (int i = 0; i < 10; i++) {
System.out.println(naN1>double3); //打印结果为false
System.out.println(naN1==double3); //打印结果为false
System.out.println(naN1<double3); //打印结果为false
}
·
那么,如何比较两个NaN是否相等呢?
答案是,转为long类型进行比较。
即Double的doubleToLongBits方法。
Double的doubleToLongBits方法:
double naN1 = Double.NaN;
double naN2 = Double.NaN;
long naN1ToLongBits = Double.doubleToLongBits(naN1);
long naN2ToLongBits = Double.doubleToLongBits(naN2);
for (int i = 0; i < 10; i++) {
System.out.println(naN1ToLongBits==naN2ToLongBits);
}
或者,使用Double的compare()方法;
示例:
double naN1 = Double.NaN;
double naN2 = Double.NaN;
for (int i = 0; i < 10; i++) {
System.out.println(0==Double.compare(naN1, naN2));
} 
来看看这个Double的compare()方法:
public static int compare(double d1, double d2) {
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
// Cannot use doubleToRawLongBits because of possibility of NaNs.
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}可以看出,对于NaN这种特殊情况,在compare()方法里边,其实还是将其通过Double.doubleToLongBits()方法转为long类型,然后再进行比较的。
版权声明:本文为qq_44750696原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。