前面幾篇文章我們看了JAVA基本數(shù)據(jù)類型整型的包裝類,接下來我們看下浮點(diǎn)型float的包裝類Float類。
基礎(chǔ)知識:
1.IEEE 754:
IEEE 754是一個標(biāo)準(zhǔn),該標(biāo)準(zhǔn)定義了浮點(diǎn)數(shù)的格式還有一些特殊值,它規(guī)定了計(jì)算機(jī)中二進(jìn)制與十進(jìn)制浮點(diǎn)數(shù)轉(zhuǎn)換的格式及方法。規(guī)定了四種表示浮點(diǎn)數(shù)值的方法,單精確度(32位)、雙精確度(64位)、延伸單精確度(43位以上)與延伸雙精確度(79位以上)。JAVA語言支持這里的單精確度float,與雙精確度double。
2.無窮大:
JAVA中用Infinity表示正無窮大,任何有限正數(shù)除以0為正無窮大,正無窮的值為0x7f800000。用-Infinity表示負(fù)無窮大,任何有限負(fù)數(shù)除以0為負(fù)無窮的,負(fù)無窮的值為0xff800000。
3.NAN:
不是一個數(shù)(not a number ),NaN 用來表示處理計(jì)算中出現(xiàn)的錯誤情況,比如0除以0或負(fù)數(shù)平方根。
主要屬性:
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
public static final float NaN = 0.0f / 0.0f;
public static final float MAX_VALUE = 0x1.fffffeP+127f;
public static final float MIN_NORMAL = 0x1.0p-126f;
public static final float MIN_VALUE = 0x0.000002P-126f;
public static final int MAX_EXPONENT = 127;
public static final int MIN_EXPONENT = -126;
POSITIVE_INFINITY 表示正無窮大,其值為0x7f800000。
NEGATIVE_INFINITY 表示負(fù)無窮大,其值為0xff800000。
NaN 表示計(jì)算出錯的情況,NaN 實(shí)際上是一個數(shù),而是一族數(shù)。
MAX_VALUE最大的浮點(diǎn)數(shù)值,其值為3.4028235E38,即2的127次方。
MIN_NORMAL 用來表示最小標(biāo)準(zhǔn)值,它定義為0x1.0p-126f,這里其實(shí)就是2的-126次方的了,值為1.17549435E-38f。
MIN_VALUE 最小的浮點(diǎn)數(shù)值,其值為1.4e-45f。
MAX_EXPONENT用來表示指數(shù)的最大值,這里定為127。
MIN_EXPONENT 用來表示指數(shù)的最小值,這里定為-126。
toString(float f):
public static String toString(float f) {
return FloatingDecimal.toJavaFormatString(f);
}
通過FloatingDecimal類的toJavaFormatString方法轉(zhuǎn)成字符串。它處理的過程是先將浮點(diǎn)數(shù)轉(zhuǎn)成IEEE-754標(biāo)準(zhǔn)的二進(jìn)制形式,并且還要判斷是否是正負(fù)無窮大,是否是NaN。然后再按照IEEE-754標(biāo)準(zhǔn)從二進(jìn)制轉(zhuǎn)換成十進(jìn)制,最后生成浮點(diǎn)數(shù)對應(yīng)的字符串。
toHexString(float f) :
public static String toHexString(float f) {
if (Math.abs(f) < FloatConsts.MIN_NORMAL
&& f != 0.0f ) {
String s = Double.toHexString(Math.scalb((double)f,
DoubleConsts.MIN_EXPONENT-
FloatConsts.MIN_EXPONENT));
return s.replaceFirst("p-1022$", "p-126");
}
else
return Double.toHexString(f);
}
看方法名就知道是將,float轉(zhuǎn)換成16進(jìn)制表示的形式,這里先會判斷下目標(biāo)數(shù)f,如果是NaN則返回字符串"NaN",如果是正無窮大,則返回Infinity。如果是負(fù)無窮大則返回-Infinity。如果f為0,則用返回"0x0.0p0",-0則返回"-0x0.0p0"。如果f是具有標(biāo)準(zhǔn)化表示形式的float值,則使用子字符串表示有效位數(shù)和指數(shù)。有效位數(shù)用字符串"0x1."表示,后跟該有效位數(shù)小數(shù)部分的小寫十六進(jìn)制表示形式。除非所有位數(shù)都為0,否則移除十六進(jìn)制表示形式中的尾部0,在所有位數(shù)為0的情況下,可以用一個0表示,然后用"p"表示指數(shù),后跟無偏指數(shù)的十進(jìn)制字符串,該值與對指數(shù)值調(diào)用Integer.toString生成的值相同。如果f是具有subnormal表示形式的float值,則用字符"0x0."表示有效位數(shù),后跟該有效位數(shù)小數(shù)部分的十六進(jìn)制表示形式,移除十六進(jìn)制表示形式中的尾部0,然后用"p-126"表示指數(shù)。注意,在subnormal有效位數(shù)中,必須至少有一個非0位數(shù)。(網(wǎng)上摘的,我也看不大懂)
valueOf
public static Float valueOf(String s) throws NumberFormatException {
return new Float(parseFloat(s));
}
public static Float valueOf(float f) {
return new Float(f);
}
返回對應(yīng)浮點(diǎn)數(shù)的Float對象,可以看到在Float類中沒有像Byte或是Integer類那樣將常用的數(shù)存放到緩存池中。這里是直接創(chuàng)建對象,然后返回。
parseFloat(String s) :
public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.parseFloat(s);
}
通過調(diào)用FloatingDecimal的parseFloat方法來實(shí)現(xiàn)對字符串的轉(zhuǎn)換.這里會先判斷s是否為NaN,Infinity,-Infinity等數(shù)。如果是以0x打頭則會按16進(jìn)制轉(zhuǎn)換為10進(jìn)制轉(zhuǎn)換。判斷是否包含了E字符,即是否是科學(xué)計(jì)數(shù)法,如果有則需要處理。
isNaN:
public static boolean isNaN(float v) {
return (v != v);
}
判斷一個數(shù)是否是NaN,該方法邏輯很簡單,直接判斷一個數(shù)是否與自己相等,因?yàn)橐?guī)定一個NaN與任何值都不相等,包括它自己。這部分邏輯在JVM中會做,這里直接通過比較來判斷就可以了。
isInfinite
public static boolean isInfinite(float v) {
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
判斷一個數(shù)是否為無窮數(shù),無窮大POSITIVE_INFINITY或無窮小NEGATIVE_INFINITY。
isFinite:
public static boolean isFinite(float f) {
return Math.abs(f) <= FloatConsts.MAX_VALUE;
}
判斷一個數(shù)是否為有窮數(shù)。絕對值(Math.abs(f)是用來獲取一個數(shù)的絕對值的)小于FloatConsts.MAX_VALUE的數(shù)則為有窮數(shù),F(xiàn)loatConsts.MAX_VALUE的值為3.4028235e+38f,它其實(shí)與Float類中定義的MAX_VALUE相同。
floatToRawIntBits:
public static native int floatToRawIntBits(float value);
floatToRawIntBits是一個本地方法,該方法主要是將一個浮點(diǎn)數(shù)轉(zhuǎn)成IEEE 754標(biāo)準(zhǔn)的二進(jìn)制形式對應(yīng)的整型數(shù)。用其它語言實(shí)現(xiàn)。
floatToIntBits:
public static int floatToIntBits(float value) {
int result = floatToRawIntBits(value);
if ( ((result & FloatConsts.EXP_BIT_MASK) ==
FloatConsts.EXP_BIT_MASK) &&
(result & FloatConsts.SIGNIF_BIT_MASK) != 0)
result = 0x7fc00000;
return result;
}
該方法主要先通過調(diào)用floatToRawIntBits獲取到IEEE 754標(biāo)準(zhǔn)對應(yīng)的整型數(shù),然后再分別用FloatConsts.EXP_BIT_MASK和FloatConsts.SIGNIF_BIT_MASK兩個掩碼去判斷是否為NaN,0x7fc00000對應(yīng)的即為NaN。
intBitsToFloat:
public static native float intBitsToFloat(int bits);
該方法與floatToRawIntBits方法對應(yīng),intBitsToFloat同樣是一個本地方法,該方法主要是將一個IEEE 754標(biāo)準(zhǔn)的二進(jìn)制形式對應(yīng)的整型數(shù)轉(zhuǎn)成一個浮點(diǎn)數(shù)。用其它語言實(shí)現(xiàn)。
sum:
public static float sum(float a, float b) {
return a + b;
}
計(jì)算兩個浮點(diǎn)數(shù)的和。
max:
public static float max(float a, float b) {
return Math.max(a, b);
}
取兩個浮點(diǎn)數(shù)中較大的一個。
min:
public static float min(float a, float b) {
return Math.min(a, b);
}
取兩個浮點(diǎn)數(shù)中較小的一個。
查看所有目錄