JDK源碼-Float類

上節我們介紹過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 標準的一個實現,根本還是在於標準的理解


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章