除了表示普通的数字之外, float 和 double 类型还能表示四个特殊的值:正无穷大、负无穷大、零和 NaN。如果浮点数运算的结果超出了 float 或 double 能表示的范围上限,得到的是无穷大。如果浮点数的运算结果超出了 float 或 double 能表示的范围下限,得到的是零。
Java 的浮点类型区分正零和负零,具体是哪个值取决于从哪个方向出现的下溢。在实际使用中,正零和负零的表现基本一样。最后一种特殊的浮点数 NaN,是“Not-a-Number”的简称,表示“不是数字”。如果浮点数运算不合法,例如 0.0/0.0,得到的就是 NaN。
以下几个例子得到的结果就是这些特殊的值:
double inf = 1.0/0.0; // 无穷大
double neginf = -1.0/0.0; // 负无穷大
double negzero = -1.0/inf; // 负零
double NaN = 0.0/0.0; // NaN
Java 浮点数类型能处理到无穷大的上溢以及到零的下溢,因此浮点数运算从不抛出异常,就算执行非法运算也没事,例如零除以零,或计算负数的平方根。
float 和 double 基本类型都有对应的类,分别为 Float 和 Double。这两个类都定义了一些有用的常量: MIN_VALUE、 MAX_VALUE、NEGATIVE_INFINITY、 POSITIVE_INFINITY 和 NaN。
无穷大浮点数的表现和设想的一样,例如,无穷大之间的加减运算得到的还是无穷大。负零的表现几乎和正零一样,而且事实上,相等运算符 == 会告诉你,负零和正零是相等的。区分负零、正零和普通的零有一种方法——把它作为被除数: 1.0/0.0 得到的是正无穷大,但是 1.0 除以负零得到的是负无穷大。因为 NaN 不是数字,所以 ==运算符会告诉我们它不等于任何其他数字,甚至包括它自己。若想检查某个 float 或double 值是否为 NaN,必须使用 Float.isNaN() 或 Double.isNaN() 方法