在 Java 計算中,肯定會使用各種基本數(shù)據(jù)類型味抖,進(jìn)行加減乘除等操作。但是假如哪一天忍坷,你發(fā)現(xiàn)一個函數(shù)給你返回了一個float
結(jié)果熔脂,你打印出來后卻發(fā)現(xiàn)不是小數(shù)霞揉,而是Infinity
或NaN
這種東西,你可能就一臉黑人問號了适秩。
這兩個值確實是 Java 提供的數(shù)值秽荞,一個返回float
的函數(shù)給你返回這兩個值也是沒有任何問題的。那這兩個值各代表什么意義呢扬跋,下面給出答案:
無窮大 Infinity
在Float
類中,有兩個靜態(tài)常量:
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
這兩個常量一個表示正無窮洒试,一個表示負(fù)無窮儡司。在計算上余指,有一點一定要特別注意:
無窮大加上一個數(shù)還是無窮大酵镜。
double infinity = 1.0 / 0;
System.out.println(infinity); //Infinity
System.out.println(infinity + 1); //Infinity
System.out.println(infinity == i + 1); //true
如果你要初始化一個數(shù)為無窮大淮韭,那么可以用任何被計算為無窮大的浮點算術(shù)表達(dá)式來初始化贴届,或者使用Float
提供的常量:
float infinity = 1.0 / 0.0;
float infinity = Float.POSITIVE_INFINITY;
不是數(shù)字的數(shù) NaN
NaN,not a number占键,對于所有沒有良好的數(shù)字定義的浮點計算畔乙,如0.0/0.0,結(jié)果都是NaN返咱。在Float
類中咖摹,提供了一個常量來表示NaN:
public static final float NaN = 0.0f / 0.0f;
初始化一個數(shù)字為NaN难述,可以像Float
一樣用任何計算結(jié)果為NaN
的浮點算術(shù)表達(dá)式或直接用Float
提供的這個常量:
float nan= 0.0 / 0.0;
float nan = Float.NaN ;
NaN 有一些奇葩的性質(zhì)龄广,在計算時需要特別注意:
- NaN 不等于任何浮點數(shù)值硫眯,包括它自身在內(nèi);即它與任何數(shù)比較均返回false择同。
- 任何浮點操作两入,只要它的一個或多個操作數(shù)為NaN,那么其結(jié)果為NaN敲才。
雖然NaN
與任何數(shù)比較均返回false
裹纳,但是使用Float.compare()
這個方法來比較兩個NaN
時,卻會得到相等的結(jié)果紧武。如下:
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中的常量做一下總結(jié):
-
float POSITIVE_INFINITY = 1.0f / 0.0f;
正無窮大 -
float NEGATIVE_INFINITY = -1.0f / 0.0f;
負(fù)無窮大 -
float NaN = 0.0f / 0.0f;
表示不是一個數(shù)字 -
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數(shù)值的最大指數(shù)值 -
final int MIN_EXPONENT = -126;
一個有限float數(shù)值的最小指數(shù)值 -
final int SIZE = 32;
一個float類型數(shù)值占用的比特數(shù) -
final int BYTES = SIZE / Byte.SIZE;
一個float類型數(shù)值占用的字節(jié)數(shù)
另外,在 Java 提供的另一個浮點類Double
類中妥箕,也存在相同意義的常量畦幢,只是值不同而已瘦真。