文章

白话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 进行授权