文章目录
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类。