【Java】JDK源码分析——Float

一.概述

Float是float的包装类,用于表示单精度浮点数。
Float的表示方法和int、short、long不同。Float满足IEEE754浮点数表示法。
Float表示的数值占4个字节,共32位。其中0到22位表示尾数部分;23到31位表示指数部分;32位为符号位。
在这里插入图片描述
Float.java中的相关代码:

public final class Float extends Number implements Comparable<Float> {}

1.Float被final修饰,不能被继承。
2.继承了Number,可以实现数值间的转换。
3.实现了Comparable<Float>接口,可以进行Float类型对象之间的比较。

二.源码分析

1.全局变量

Float.java中的相关代码:

	// 表示正无穷
	// 它的值和Float.intBitsToFloat(0x7f800000)计算的结果相同
	public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

	// 表示负无穷
	// 它的值和Float.intBitsToFloat(0xff800000)计算的结果相同
	public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

	// 表示不是一个数,即一个数不能被表示
	// 它的值和Float.intBitsToFloat(0x7fc00000)计算的结果相同
	public static final float NaN = 0.0f / 0.0f;

	// 表示float所能表示的最大值:3.4028235e+38f
	// 它的值和Float.intBitsToFloat(0x7f7fffff)计算的结果相同
	public static final float MAX_VALUE = 0x1.fffffeP+127f;

	// 表示正常情况下,float可以表示的最小正数:1.17549435E-38f
	// 正常情况为小数点前为0x1
	// 它的值和Float.intBitsToFloat(0x00800000)计算的结果相同
	public static final float MIN_NORMAL = 0x1.0p-126f;

	// 表示float实际上可以表示的最小非零正数:1.4e-45f
	// 小数点前为0x0
	// 它的值和Float.intBitsToFloat(0x1)计算的结果相同
	public static final float MIN_VALUE = 0x0.000002P-126f;

	// float可以表示的最大指数
	public static final int MAX_EXPONENT = 127;

	// float可以表示的最小指数
	public static final int MIN_EXPONENT = -126;

	// float占的位数
	public static final int SIZE = 32;

	// 一个float数值占的字节数
	public static final int BYTES = SIZE / Byte.SIZE;

	// 抑制没有类型检查而出现的警告
	@SuppressWarnings("unchecked")
	// Float类中对应的原始的float
	// Float.class和float.class不相等,但Float.TYPE和float.class相等
	public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");

	// 用于存储float的数值
	private final float value;

	// 用于序列化
	private static final long serialVersionUID = -2671257302660747028L;

2.构造方法

1)参数为float

Float.java中的相关代码:

	public Float(float value) {
    	// 保存到全局变量
        this.value = value;
	}

2)参数为double

Float.java中的相关代码:

	public Float(double value) {
   		// 先类型转换,再保存到全局变量
        this.value = (float)value;
	}

3)参数为String

Float.java中的相关代码:

	public Float(String s) throws NumberFormatException {
    	// 调用parseFloat方法,将字符串解析成float型数值
        value = parseFloat(s);
	}

3. parseFloat方法

将字符串解析成float型数值。
Float.java中的相关代码:

	public static float parseFloat(String s) throws NumberFormatException {
    	// 调用FloatingDecimal的parseFloat方法
        return FloatingDecimal.parseFloat(s);
	}

4. valueOf方法

1)参数为float

将float型数值转换为Float对象。
Float.java中的相关代码:

	public static Float valueOf(float f) {
    	// 创建Float对象,对float数值进行封装,返回
        return new Float(f);
    }

2)参数为String

将String对象转换为Float对象。
Float.java中的相关代码:

	public static Float valueOf(String s) throws NumberFormatException {
    	// 调用parseFloat方法,将字符串解析成float型数值
    	// 创建Float对象,对float数值进行封装,返回
        return new Float(parseFloat(s));
	}

5. isNaN方法

判断当前的数是不是数值型的数。
Float.java中的相关代码:

	public boolean isNaN() {
		// 调用了重载方法
        return isNaN(value);
	}

调用重载的isNaN方法。
判断float型的数是不是数值型的数。
Float.java中的相关代码:

	public static boolean isNaN(float v) {
		// 每个NaN的存储地址不同
        return (v != v);
    }

6. isInfinite方法

判断当前的数是不是无穷大。
Float.java中的相关代码:

	public boolean isInfinite() {
		// 调用了重载方法
        return isInfinite(value);
	}

调用了重载的isInfinite方法。
判断float型的数是不是无穷大。
Float.java中的相关代码:

	public static boolean isInfinite(float v) {
		// 判断是否为正无穷或负无穷
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
    }

7. isFinite方法

判断一个float型的数是否有限。
Float.java中的相关代码:

     public static boolean isFinite(float f) {
		// 对float数取绝对值,判断是否小于等于float能表示的最大值
        return Math.abs(f) <= FloatConsts.MAX_VALUE;
	}

8. floatToIntBits方法

将float型的数转换成满足IEEE 754浮点型表示法的int型的数。

符号位MASK:0x80000000
指数位MASK:0x7f800000
有效位MASK:0x007fffff
正无穷:0x7f800000
负无穷:0xff800000
NaN:0x7fc00000

Float.java中的相关代码:

	public static int floatToIntBits(float value) {
    	// 调用floatToRawIntBits转换成int型的数
		// 详解在1)处
        int result = floatToRawIntBits(value);
        // 根据指数位和非零有效位判断是不是NaN
        if ( ((result & FloatConsts.EXP_BIT_MASK) ==
              FloatConsts.EXP_BIT_MASK) &&
             (result & FloatConsts.SIGNIF_BIT_MASK) != 0)
            // 若是,则设置为NaN
            result = 0x7fc00000;
        // 返回
        return result;
	}

1)floatToRawIntBits方法

Float.java中的相关代码:

	public static native int floatToRawIntBits(float value);

该方法是一个native方法,该方法会将一个float型的数转换成满足IEEE 754浮点型表示法的int型的数,即使该数为NaN,也会进行转换。

9. intBitsToFloat方法

将int型的数按照IEEE 754浮点数标准转换为float型的数。
Float.java中的相关代码:

	public static native float intBitsToFloat(int bits);

该方法是一个native方法。

10. toString方法

将Float对象转换为String对象。
Float.java中的相关代码:

	public String toString() {
		// 调用了重载方法
        return Float.toString(value);
    }

调用了重载的toString方法。
Float.java中的相关代码:

	public static String toString(float f) {
		// 调用FloatingDecimal的toJavaFormatString方法
        return FloatingDecimal.toJavaFormatString(f);
	}

11. toHexString方法

将float型的数转换为十六进制的String对象。
Float.java中的相关代码:

	public static String toHexString(float f) {
    	// 对数值取绝对值,若小于正常的最小正数,同时不为0
        if (Math.abs(f) < FloatConsts.MIN_NORMAL
            &&  f != 0.0f ) {
            // 对数值进行类型转换,变为double型的数
            // 调用Math的scalb方法
            // DoubleConsts.MIN_EXPONENT-FloatConsts.MIN_EXPONENT = -896
			// 相当于数值f乘以2的-896次方
			// 最后调用Double的toHexString进行转换
            String s = Double.toHexString(Math.scalb((double)f,
                        DoubleConsts.MIN_EXPONENT-FloatConsts.MIN_EXPONENT));
            // 因为Double的指数为-1022,Float为-126,所以需要替换
            // 使用正则表达式,从后向前替换
            return s.replaceFirst("p-1022$", "p-126");
        }
        else // 若大于等于正常的最小整数,或等于0
            // 调用Double的toHexString进行处理
            return Double.toHexString(f);
	}

12. byteValue方法

获取当前数值对应的byte型数。
Float.java中的相关代码:

	public byte byteValue() {
    	// 进行类型转换,返回
        return (byte)value;
	}

13. shortValue方法

获取当前数值对应的short型数。
Float.java中的相关代码:

	public short shortValue() {
    	// 进行类型转换,返回
        return (short)value;
	}

14. intValue方法

获取当前数值对应的int型数。
Float.java中的相关代码:

    public int intValue() {
    	// 进行类型转换,返回
        return (int)value;
	}

15. longValue方法

获取当前数值对应的long型数。
Float.java中的相关代码:

	public long longValue() {
    	// 进行类型转换,返回
        return (long)value;
	}

16. floatValue方法

获取当前数值对应的float型数。
Float.java中的相关代码:

	public float floatValue() {
    	// 直接返回
        return value;
	}

17. doubleValue方法

获取当前数值对应的double型数。
Float.java中的相关代码:

	public double doubleValue() {
    	// 进行类型转换,返回
        return (double)value;
	}

18. hashCode方法

获取Float对象的哈希值。
Float.java中的相关代码:

    @Override
	public int hashCode() {
		// 调用Float的静态方法
        return Float.hashCode(value);
	}

1)hashCode方法

Float.java中的相关代码:

	public static int hashCode(float value) {
    	// 调用floatToIntBits方法,转化为满足IEEE 754浮点表示的int型数
        return floatToIntBits(value);
	}

19. equals方法

比较两个Float对象是否相等。
Float.java中的相关代码:

	public boolean equals(Object obj) {
    	// 若类型为Float
    	// 同时转换为int型后比较相等,则返回true
        return (obj instanceof Float)
               && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
	}

20. compareTo方法

对两个Float对象进行比较。
若相等,则返回0。若大于anotherFloat则返回1,小于则返回-1。
Float.java中的相关代码:

	public int compareTo(Float anotherFloat) {
    	// 调用Float的静态方法compare
        return Float.compare(value, anotherFloat.value);
	}

1)compare方法

Float.java中的相关代码:

	public static int compare(float f1, float f2) {
    	// 若小于,则返回-1
        if (f1 < f2)
            return -1;
		// 若大于,则返回1
        if (f1 > f2)
            return 1;

        // 此时两个数可能相等,或至少其中一个为NaN
        // 调用floatToIntBits方法进行转换
        int thisBits    = Float.floatToIntBits(f1);
        int anotherBits = Float.floatToIntBits(f2);

		// 若相等,则返回0
        // 若小于,说明thisBits =-0.0, anotherBits = 0.0)
        // 或thisBits != NaN, anotherBits = NaN
        // 若大于,说明thisBits =0.0, anotherBits = -0.0)
        // 或thisBits = NaN, anotherBits != NaN
        return (thisBits == anotherBits ?  0 : 
                (thisBits < anotherBits ? -1 : 
                 1));
	}

21. sum方法

求两个float数的和。
Float.java中的相关代码:

	public static float sum(float a, float b) {
    	// 相加,返回
        return a + b;
    }

22.max方法

求两个float数的最大值。
Float.java中的相关代码:

	public static float max(float a, float b) {
    	// 调用Math的max方法
        return Math.max(a, b);
	}

23. min方法

求两个float数的最小值。
Float.java中的相关代码:

	public static float min(float a, float b) {
		// 调用Math的min方法
        return Math.min(a, b);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值