Double里边的NaN是什么?

先看源码:

/**
 * 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版权协议,转载请附上原文出处链接和本声明。