上节我们介绍过JDK源码-Double类
本节我们介绍Float,Float 类在对象中包装了一个基本类型 float 的值。此外,该类提供了多个方法,能在 float 类型与 String 类型之间互相转换,同时还提供了处理 float 类型时比较常用的常量和方法。
一、实现接口
Float类是基本类型float的包装类,继承了Number类,并且实现了Comparable接口
public final class Float extends Number implements Comparable<Float>
二、构造方法
//构造一个新分配的 Float 对象,它表示基本的 float 参数。
public Float(float value) {
this.value = value;
}
//构造一个新分配的 Float 对象,它表示将 double 类型转换为 float 类型的参数。
public Float(double value) {
this.value = (float)value;
}
//构造一个新分配的 Float 对象,它表示将 String 类型参数解析为 float 值。
public Float(String s) throws NumberFormatException {
value = parseFloat(s);
}
例如,以下代码分别使用以上 3 个构造方法获取 Float 对象:
Float float1=new Float(3.14145); //以 double 类型的变量作为参数创建 Float 对象
Float float2=new Float(6.5); //以 float 类型的变量作为参数创建 Float 对象
Float float3=new Float("3.1415"); //以 String 类型的变量作为参数创建 Float 对象
用来存放Float对象那float对应的值。
private final float value;
三、常用常量
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;
public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f
public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f
public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
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;
@SuppressWarnings("unchecked")
public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");
Float 类中常量的使用:
float max_value=Float.MAX_VALUE; //获取 float 类型可取的最大值
float min_value=Float.MIN_VALUE; //获取 float 类型可取的最小值
float min_normal=Float.MIN_NORMAL; //获取 float 类型可取的最小标准值
float size=Float.SIZE; //获取 float 类型的二进制位
四、常用方法
toXXXString 系列
//静态方法
public static String toString(float f) {
return FloatingDecimal.toJavaFormatString(f);
}
//静态方法返回float 参数的十六进制字符串表示形式
public static String toHexString(float f) {
if (Math.abs(f) < FloatConsts.MIN_NORMAL
&& f != 0.0f ) {// float subnormal
// Adjust exponent to create subnormal double, then
// replace subnormal double exponent with subnormal float
// exponent
String s = Double.toHexString(Math.scalb((double)f,
/* -1022+126 */
DoubleConsts.MIN_EXPONENT-
FloatConsts.MIN_EXPONENT));
return s.replaceFirst("p-1022$", "p-126");
}
else // double string will be the same as float string
return Double.toHexString(f);
}
//实例方法内部调用 static String toString(float f)
public String toString() {
return Float.toString(value);
}
valueOf方法
//依赖parseFloat方法所以下面说跟valueOf(String)表现效果相同,本身就是一样
public static Float valueOf(String s) throws NumberFormatException {
return new Float(parseFloat(s));
}
public static Float valueOf(float f) {
return new Float(f);
}
parseFloat(String s)
将数字字符串转换为 float 数值
public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.parseFloat(s);
}
isNaN方法
//静态方法是否一个非数字(NaN) 值, 非数值 true
public static boolean isNaN(float v) {
return (v != v);
}
//实例方法依赖静态方法
public boolean isNaN() {
return isNaN(value);
}
isInfinite和isFinite
//静态方法是否是无穷大,是无穷大true
public boolean isInfinite() {
return isInfinite(value);
}
//静态方法是否是有限的浮点数,有限的true
public boolean isInfinite() {
return isInfinite(value);
}
XXXValue系列
似之前介绍的其他数值类型全部都是强转,内部的 valuereturn (XXX)value;
public byte byteValue() {
return (byte)value;
}
public short shortValue() {
return (short)value;
}
public int intValue() {
return (int)value;
}
public long longValue() {
return (long)value;
}
public float floatValue() {
return value;
}
public double doubleValue() {
return (double)value;
}
equals(Object obj)
将此对象与指定对象进行比较,当且仅当参数不是 null 而是 Float 对象,且表示的 float 值与此对象表示的 float 值相同时,结果为 true
public boolean equals(Object obj) {
return (obj instanceof Float) && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
hashCode方法
//实例方法依赖静态方法
@Override
public int hashCode() {
return Float.hashCode(value);
}
//静态方法获得一个value的hashcode值
public static int hashCode(float value) {
return floatToIntBits(value);
}
compare和compareTo方法
//实例方法两个对象进行大小比较,依赖于静态方法
public int compareTo(Float anotherFloat) {
return Float.compare(value, anotherFloat.value);
}
//静态方法比较两个float f1< f2 小于0,f1 = f2 等于0 f1 > f2 大于0
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 sum(float a, float b) {
return a + b;
}
public static float max(float a, float b) {
return Math.max(a, b);
}
public static float min(float a, float b) {
return Math.min(a, b);
}
五、总结
其实浮点数的表示形式与使用规范才是重点
Float只是float的包装,float也只是IEEE754 标准的一个实现,根本还是在于标准的理解