JDK源码学习与分析之Float

        本文基于JDK1.8学习与分析Float源码。

public final class Float extends Number implements Comparable<Float>

        Float类在一个对象中包含一个原始类型float的值。 类型为Float的对象包含一个单一字段,其类型为float 。此外,该类还提供了几种将float转换为StringString转换为float ,以及在处理float时有用的其他常数和方法。

package java.lang;

import sun.misc.FloatingDecimal;
import sun.misc.FloatConsts;
import sun.misc.DoubleConsts;

/**
 * @author  Lee Boynton
 * @author  Arthur van Hoff
 * @author  Joseph D. Darcy
 * @since JDK1.0
 */
public final class Float extends Number implements Comparable<Float> {
    /**
     * float类型的正负无穷大
     */
    public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
    public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

    /**
     * float类型的非数字值
     */
    public static final float NaN = 0.0f / 0.0f;

    /**
     * float类型的最大正数值
     */
    public static final float MAX_VALUE = 0x1.fffffeP+127f;

    /**
     * float类型的最小正数值
     */
    public static final float MIN_NORMAL = 0x1.0p-126f;

    /**
     * float最小的正非零值
     */
    public static final float MIN_VALUE = 0x0.000002P-126f;

    /**
     * 最大指数常量127
     */
    public static final int MAX_EXPONENT = 127;

    /**
     * 最小指数常量-126
     */
    public static final int MIN_EXPONENT = -126;

    /**
     * 表示一个 float值的位数
     */
    public static final int SIZE = 32;

    /**
     * 用于表示 float值的字节数
     */
    public static final int BYTES = SIZE / Byte.SIZE;

    /**
     * 获取包装类对应的Class类对象
     */
    @SuppressWarnings("unchecked")
    public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");

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

    /**
     * 返回float参数的十六进制字符串float形式,调用Double类的方法
     */
    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类型
     */
    public static Float valueOf(String s) throws NumberFormatException {
        return new Float(parseFloat(s));
    }

    /**
     * float返回Float包装类
     */
    public static Float valueOf(float f) {
        return new Float(f);
    }

    /**
     * 解析字符串为float
     */
    public static float parseFloat(String s) throws NumberFormatException {
        return FloatingDecimal.parseFloat(s);
    }

    /**
     * 判断float是否数值类型
     */
    public static boolean isNaN(float v) {
        return (v != v);
    }

    /**
     * 判断float是否无限大
     */
    public static boolean isInfinite(float v) {
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
    }


    /**
     * 判断float是否有限浮点数
     */
    public static boolean isFinite(float f) {
        return Math.abs(f) <= FloatConsts.MAX_VALUE;
    }

    private final float value;

    /**
     * 有参构造方法
     */
    public Float(float value) {
        this.value = value;
    }

    public Float(double value) {
        this.value = (float)value;
    }

    /**
     * 参数为字符串的构造方法
     */
    public Float(String s) throws NumberFormatException {
        value = parseFloat(s);
    }

    /**
     * 判断是否数值类型
     */
    public boolean isNaN() {
        return isNaN(value);
    }

    /**
     * 判断是否无限大
     */
    public boolean isInfinite() {
        return isInfinite(value);
    }

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

    /**
     * 获取float的byte类型值
     */
    public byte byteValue() {
        return (byte)value;
    }

    /**
     * 获取float的short类型值
     */
    public short shortValue() {
        return (short)value;
    }

    /**
     * 获取float的int类型值
     */
    public int intValue() {
        return (int)value;
    }

    /**
     * 获取float的long类型值
     */
    public long longValue() {
        return (long)value;
    }

    /**
     * 获取float的float类型值
     */
    public float floatValue() {
        return value;
    }

    /**
     * 获取float的double类型值
     */
    public double doubleValue() {
        return (double)value;
    }

    /**
     * float的哈希码
     */
    @Override
    public int hashCode() {
        return Float.hashCode(value);
    }

    /**
     * 获取给定float的哈希码
     */
    public static int hashCode(float value) {
        return floatToIntBits(value);
    }

    /**
     * 将此对象与指定对象进行比较
     */
    public boolean equals(Object obj) {
        return (obj instanceof Float)
                && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }

    /**
     * float转int
     */
    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;
    }

    public static native int floatToRawIntBits(float value);
    public static native float intBitsToFloat(int bits);

    /**
     * 数字比较两个Float对象
     */
    public int compareTo(Float anotherFloat) {
        return Float.compare(value, anotherFloat.value);
    }

    /**
     * 比较两个指定的float值
     */
    public static int compare(float f1, float f2) {
        if (f1 < f2)
            return -1;
        if (f1 > f2)
            return 1;
        int thisBits    = Float.floatToIntBits(f1);
        int anotherBits = Float.floatToIntBits(f2);

        return (thisBits == anotherBits ?  0 :
                (thisBits < anotherBits ? -1 :
                        1));
    }

    /**
     * 对两个float求和
     */
    public static float sum(float a, float b) {
        return a + b;
    }

    /**
     * 获取两个float中的较大值
     */
    public static float max(float a, float b) {
        return Math.max(a, b);
    }

    /**
     * 获取两个float中的较小值
     */
    public static float min(float a, float b) {
        return Math.min(a, b);
    }

    private static final long serialVersionUID = -2671257302660747028L;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值