Java8源码 java.lang 包 11、Float类

本文详细介绍了Java8中Float类的核心方法,包括floatToIntBits、floatToRawIntBits和intBitsToFloat,以及浮点数的比较、计算、转换和数值判断。重写了Object的方法如equals()、hashCode()和toString(),并讨论了如何将浮点数与二进制整型数相互转换。此外,还涵盖了浮点数的isNaN、isInfinite和isFinite()等判断方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Float 类是基本类型 float 的包装类。它提供了一系列 float 和 String 之间的相互转换方法,同时也提供了一些处理 float 的常量和方法。

Double 类和 Float类几乎相同。除了方法名和处理二进制的边界范围不同外。

类的定义

public final class Float extends Number implements Comparable<Float> 

成员变量

    private final float value;	// 存储 Float 对象的值

类变量

	//	正无穷
	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;
	//	最大值,即 (2-2-23)·2127
	public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f
	//	最小值,即 2^-149
    public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
	//	最小正标准值 即 2^-126
    public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f
	//	最大指数值
    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;

构造方法

    public Float(float value) {
        this.value = value;
    }
    
    public Float(double value) {
        this.value = (float)value;
    }
    
    public Float(String s) throws NumberFormatException {
        value = parseFloat(s);
    }

其他方法

核心方法

后面的其他方法大多要采用这三种中方法进行比较计算。其实就是将浮点数的 IEEE 754 的二进制形式转换成整数值后再进行一些计算处理。

floatToIntBits

    public static int floatToIntBits(float value) {
        int result = floatToRawIntBits(value);
        // Check for NaN based on values of bit fields, maximum
        // exponent and nonzero significand.
        if ( ((result & FloatConsts.EXP_BIT_MASK) ==
              FloatConsts.EXP_BIT_MASK) &&
             (result & FloatConsts.SIGNIF_BIT_MASK) != 0)
            result = 0x7fc00000;	//NaN
        return result;
    }

将一个 IEEE 754 标准的二进制形式对应的整型数转成一个浮点数。与 intBitsToFloat 的值相同

floatToRawIntBits

    public static native int floatToRawIntBits(float value);

将一个浮点数转成 IEEE 754 标准的二进制形式对应的整数。

intBitsToFloat

    public static native float intBitsToFloat(int bits);

floatToRawIntBits相反。将一个 IEEE 754 标准的二进制形式对应的整数转成一个浮点数。

重写 Object的方法

equals(Object obj)

    public boolean equals(Object obj) {
        return (obj instanceof Float)
               && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }

是转换成整型数值后进行的比较,并没有处理精度丢失的问题。

hashCode()

    @Override
    public int hashCode() {
        return Float.hashCode(value);
    }

	public static int hashCode(float value) {
        return floatToIntBits(value);
    }

Float 对象的哈希码就是该浮点数的 IEEE 754 标准对应的整型数。

toString()

    public String toString() {
        return Float.toString(value);
    }

float转字符串 toString(float f)

    public static String toString(float f) {
        return FloatingDecimal.toJavaFormatString(f);
    }

底层涉及一些 native 方法。大体上就是将浮点数按 IEEE-754 标准转化成二进制,然后转换成十进制(浮点数不能是 NaN、Infinity、-Infinity),最后放入字符数组中,通过 String(char value[], int offset, int count) 转换成字符串

字符串转float

	public static Float valueOf(String s) throws NumberFormatException {
        return new Float(parseFloat(s));
    }	

	public static float parseFloat(String s) throws NumberFormatException {
        return FloatingDecimal.parseFloat(s);
    }

重写Number的方法

和其他包装类类似。 处了 floatValue 直接返回 value,其余都要进行强制类型转换。

数值判断

    public static boolean isNaN(float v)
    public static boolean isInfinite(float v)
    public static boolean isFinite(float f)

是否是非数字 isNaN

	public boolean isNaN() {
        return isNaN(value);
    }
	public static boolean isNaN(float v) {
        return (v != v);
    }

NaN 与任何值都不相等,包括它自己。

是否是无穷数 isInfinite

    public boolean isInfinite() {
        return isInfinite(value);
    }
    public static boolean isInfinite(float v) {
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
    }

是否是有穷数 isFinite(float f)

     public static boolean isFinite(float f) {
         // FloatConsts.MAX_VALUE = 3.4028235E38F 相当于 Float.MAX_VALUE
        return Math.abs(f) <= FloatConsts.MAX_VALUE;
    }

比较

	public int compareTo(Float anotherFloat) {
        return Float.compare(value, anotherFloat.value);
    }
    
    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 max(float a, float b)
public static float min(float a, float b)
public static float sum(float a, float b)

同 Integer类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值