白话Java - Double.NaN
今天处理一个关于Double.NaN的异常。
1
Unknown column 'NaN' in 'field list'
NaN = Not a Number。就是不是数字。我们用0/0.0打印出来的结果就是NaN。
1
2
Double d = 0/0.0;
System.out.println(d);
JDK的Double类里,提供的NaN的实现是:
1
public static final double NaN = 0.0d / 0.0;
如果是非零的数除以0.0,得出的是:Infinity。正数除以0.0,就是正Infinity,负数就是-Infinity。JDK里给出样例是:
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* A constant holding the positive infinity of type
* {@code double}. It is equal to the value returned by
* {@code Double.longBitsToDouble(0x7ff0000000000000L)}.
*/
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
/**
* A constant holding the negative infinity of type
* {@code double}. It is equal to the value returned by
* {@code Double.longBitsToDouble(0xfff0000000000000L)}.
*/
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
用控制台啊打印的结果是:
1
Infinity/-Infinity
既然,NaN不是一个数,那他跟任何数比较都不相等,即使跟他自己比较。
1
System.out.println(Double.NaN == Double.NaN);//输出:false
说点通俗的,什么情况下出现NaN?其实这就是数学老师教的那些,没有意义的计算的结果。比如0/0没有意义。老师还教过什么?对啊,负数的平方根啊。所以,用Math.sqrt(-n),算出来的结果,也是NaN。
不过有一点,我也不能很好解释的就是(int) Double.NaN = 0。。这个,就先这样吧。
本文由作者按照 CC BY 4.0 进行授权