JDK1.8源码解读之 Float

381 阅读3分钟

概述

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

继承关系

public final class Float extends Number implements Comparable

继承自 Number 实现了 Comparable 接口

成员属性

private final float value;

用来存储Float的值。

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

定义float类型能表示的正无穷大

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; // 3.4028235e+38f

float类型的最大正有限值的常量

public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f

定义float能表示的最小值(二进制最高位是1)

public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f

定义float能保持的正数最小值,(二进制最高位不限制)

public static final int MAX_EXPONENT = 127;

float能表示的数的最大指数。

public static final int MIN_EXPONENT = -126;

float能表示的数的最小指数。

public static final int SIZE = 32;

一个float类型的数据需要的存储空间 32位

public static final int BYTES = SIZE / Byte.SIZE;

一个float类型的数据需要的存储空间 4比特

public static final Class TYPE = (Class) Class.getPrimitiveClass("float");

返回Float类型对应的基本数据类型名称,也就是"float"

构造器

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

关键方法

+ toHexString()

转化为16进制

public static String toHexString(float f) { ... }
+ valueOf()

返回对应的Float值

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

Stirng转化为double

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

判断非数字

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

判断是否正负无穷大

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

判断是否有限

public static boolean isFinite(float f) {
    return Math.abs(f) <= FloatConsts.MAX_VALUE;
}
+ byteValue()

转化为byte类型,

public byte byteValue() {
    return (byte)value;
}

除此之外还有其他类似方法: shortValue(),intValue(),longValue(),floatValue(),doubleValue()

+ equals()

类型相同,并且值相同,才会返回true

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

按照字节位,以long的形式读出来。

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;
    return result;
}
+ compareTo()

和另一个Double值进行比较。 实际上是两个double,按照long读取出来,进行比较。其相对大小是相同的,但是按照long读取出来会计算更快。

public int compareTo(Float anotherFloat) {
    return Float.compare(value, anotherFloat.value);
}
+ compare()

两个double进行比较

public static int compare(float f1, float f2) { ... }
+ sum()

求和

public static float sum(float a, float b) {
    return a + b;
}
+ min()

求最小值

public static float min(float a, float b) {
    return Math.min(a, b);
}
+ max()

求最大值

public static float max(float a, float b) {
    return Math.max(a, b);
}

实现原理

compare()是如何比较的?

和Double类中的campare()方法是一样的思路。在这里,比较两个float的大小的时候,是按照字节位,以int的形式读取出来的。java基本数据类型的长度如下:

类型 位(bit) 大小(字节/Byte)
byte 8 1
short 16 2
char 16 2
int 32 4
float 32 4
long 64 8
double 64 8

因为int和float的存储位数是一样的,float按照int读取出来进行比较,和float直接比较,结果是一致的。

希望和大家多多交流


我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。