上節我們介紹過JDK源碼-Double類
本節我們介紹Float,Float 類在對象中包裝了一個基本類型 float 的值。此外,該類提供了多個方法,能在 float 類型與 String 類型之間互相轉換,同時還提供了處理 float 類型時比較常用的常量和方法。
一、實現接口
Float類是基本類型float的包裝類,繼承了Number類,並且實現了Comparable接口
public final class Float extends Number implements Comparable<Float>
二、構造方法
//構造一個新分配的 Float 對象,它表示基本的 float 參數。
public Float(float value) {
this.value = value;
}
//構造一個新分配的 Float 對象,它表示將 double 類型轉換爲 float 類型的參數。
public Float(double value) {
this.value = (float)value;
}
//構造一個新分配的 Float 對象,它表示將 String 類型參數解析爲 float 值。
public Float(String s) throws NumberFormatException {
value = parseFloat(s);
}
例如,以下代碼分別使用以上 3 個構造方法獲取 Float 對象:
Float float1=new Float(3.14145); //以 double 類型的變量作爲參數創建 Float 對象
Float float2=new Float(6.5); //以 float 類型的變量作爲參數創建 Float 對象
Float float3=new Float("3.1415"); //以 String 類型的變量作爲參數創建 Float 對象
用來存放Float對象那float對應的值。
private final float value;
三、常用常量
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; // 3.4028235e+38f
public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f
public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
public static final int MAX_EXPONENT = 127;
public static final int MIN_EXPONENT = -126;
public static final int SIZE = 32;
public static final int BYTES = SIZE / Byte.SIZE;
@SuppressWarnings("unchecked")
public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");
Float 類中常量的使用:
float max_value=Float.MAX_VALUE; //獲取 float 類型可取的最大值
float min_value=Float.MIN_VALUE; //獲取 float 類型可取的最小值
float min_normal=Float.MIN_NORMAL; //獲取 float 類型可取的最小標準值
float size=Float.SIZE; //獲取 float 類型的二進制位
四、常用方法
toXXXString 系列
//靜態方法
public static String toString(float f) {
return FloatingDecimal.toJavaFormatString(f);
}
//靜態方法返回float 參數的十六進制字符串表示形式
public static String toHexString(float f) {
if (Math.abs(f) < FloatConsts.MIN_NORMAL
&& f != 0.0f ) {// float subnormal
// Adjust exponent to create subnormal double, then
// replace subnormal double exponent with subnormal float
// exponent
String s = Double.toHexString(Math.scalb((double)f,
/* -1022+126 */
DoubleConsts.MIN_EXPONENT-
FloatConsts.MIN_EXPONENT));
return s.replaceFirst("p-1022$", "p-126");
}
else // double string will be the same as float string
return Double.toHexString(f);
}
//實例方法內部調用 static String toString(float f)
public String toString() {
return Float.toString(value);
}
valueOf方法
//依賴parseFloat方法所以下面說跟valueOf(String)表現效果相同,本身就是一樣
public static Float valueOf(String s) throws NumberFormatException {
return new Float(parseFloat(s));
}
public static Float valueOf(float f) {
return new Float(f);
}
parseFloat(String s)
將數字字符串轉換爲 float 數值
public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.parseFloat(s);
}
isNaN方法
//靜態方法是否一個非數字(NaN) 值, 非數值 true
public static boolean isNaN(float v) {
return (v != v);
}
//實例方法依賴靜態方法
public boolean isNaN() {
return isNaN(value);
}
isInfinite和isFinite
//靜態方法是否是無窮大,是無窮大true
public boolean isInfinite() {
return isInfinite(value);
}
//靜態方法是否是有限的浮點數,有限的true
public boolean isInfinite() {
return isInfinite(value);
}
XXXValue系列
似之前介紹的其他數值類型全部都是強轉,內部的 valuereturn (XXX)value;
public byte byteValue() {
return (byte)value;
}
public short shortValue() {
return (short)value;
}
public int intValue() {
return (int)value;
}
public long longValue() {
return (long)value;
}
public float floatValue() {
return value;
}
public double doubleValue() {
return (double)value;
}
equals(Object obj)
將此對象與指定對象進行比較,當且僅當參數不是 null 而是 Float 對象,且表示的 float 值與此對象表示的 float 值相同時,結果爲 true
public boolean equals(Object obj) {
return (obj instanceof Float) && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
hashCode方法
//實例方法依賴靜態方法
@Override
public int hashCode() {
return Float.hashCode(value);
}
//靜態方法獲得一個value的hashcode值
public static int hashCode(float value) {
return floatToIntBits(value);
}
compare和compareTo方法
//實例方法兩個對象進行大小比較,依賴於靜態方法
public int compareTo(Float anotherFloat) {
return Float.compare(value, anotherFloat.value);
}
//靜態方法比較兩個float f1< f2 小於0,f1 = f2 等於0 f1 > f2 大於0
public static int compare(float f1, float f2) {
if (f1 < f2)
return -1; // Neither val is NaN, thisVal is smaller
if (f1 > f2)
return 1; // Neither val is NaN, thisVal is larger
// Cannot use floatToRawIntBits because of possibility of NaNs.
int thisBits = Float.floatToIntBits(f1);
int anotherBits = Float.floatToIntBits(f2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}
其他方法
public static float sum(float a, float b) {
return a + b;
}
public static float max(float a, float b) {
return Math.max(a, b);
}
public static float min(float a, float b) {
return Math.min(a, b);
}
五、總結
其實浮點數的表示形式與使用規範纔是重點
Float只是float的包裝,float也只是IEEE754 標準的一個實現,根本還是在於標準的理解