在 Java 计算中,肯定会使用各种基本数据类型,进行加减乘除等操作。但是假如哪一天,你发现一个函数给你返回了一个float
结果,你打印出来后却发现不是小数,而是Infinity
或NaN
这种东西,你可能就一脸黑人问号了。
这两个值确实是 Java 提供的数值,一个返回float
的函数给你返回这两个值也是没有任何问题的。那这两个值各代表什么意义呢,下面给出答案:
无穷大 Infinity
在Float
类中,有两个静态常量:
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
这两个常量一个表示正无穷,一个表示负无穷。在计算上,有一点一定要特别注意:
无穷大加上一个数还是无穷大。
double infinity = 1.0 / 0;
System.out.println(infinity); //Infinity
System.out.println(infinity + 1); //Infinity
System.out.println(infinity == i + 1); //true
如果你要初始化一个数为无穷大,那么可以用任何被计算为无穷大的浮点算术表达式来初始化,或者使用Float
提供的常量:
float infinity = 1.0 / 0.0;
float infinity = Float.POSITIVE_INFINITY;
不是数字的数 NaN
NaN,not a number,对于所有没有良好的数字定义的浮点计算,如0.0/0.0,结果都是NaN。在Float
类中,提供了一个常量来表示NaN:
public static final float NaN = 0.0f / 0.0f;
初始化一个数字为NaN,可以像Float
一样用任何计算结果为NaN
的浮点算术表达式或直接用Float
提供的这个常量:
float nan= 0.0 / 0.0;
float nan = Float.NaN ;
NaN 有一些奇葩的性质,在计算时需要特别注意:
- NaN 不等于任何浮点数值,包括它自身在内;即它与任何数比较均返回false。
- 任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。
虽然NaN
与任何数比较均返回false
,但是使用Float.compare()
这个方法来比较两个NaN
时,却会得到相等的结果。如下:
float nan = 0.0 / 0;
System.out.println(nan); //NaN
System.out.println(nan + 1); //NaN
System.out.println(nan == nan + 1); //false
float anan = 0.0 / 0;
System.out.println(Float.compare(nan,anan)); //true
Float 中的其他常量:
上面介绍了Float
类中的3个常量,这3个是需要特别注意的,其他Float
还有其他的常量,只是不常用而已。下面就对Float中的常量做一下总结:
-
float POSITIVE_INFINITY = 1.0f / 0.0f;
正无穷大 -
float NEGATIVE_INFINITY = -1.0f / 0.0f;
负无穷大 -
float NaN = 0.0f / 0.0f;
表示不是一个数字 -
float MAX_VALUE = 0x1.fffffeP+127f;
float能表示的最大正值:3.4028235e+38f -
float MIN_NORMAL = 0x1.0p-126f;
1.17549435E-38f -
float MIN_VALUE = 0x0.000002P-126f;
float能表示的最小正值 1.4e-45f -
final int MAX_EXPONENT = 127;
一个有限float数值的最大指数值 -
final int MIN_EXPONENT = -126;
一个有限float数值的最小指数值 -
final int SIZE = 32;
一个float类型数值占用的比特数 -
final int BYTES = SIZE / Byte.SIZE;
一个float类型数值占用的字节数
另外,在 Java 提供的另一个浮点类Double
类中,也存在相同意义的常量,只是值不同而已。