概述
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开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。