本文基于JDK1.8学习与分析Float源码。
public final class Float extends Number implements Comparable<Float>
Float
类在一个对象中包含一个原始类型float
的值。 类型为Float
的对象包含一个单一字段,其类型为float
。此外,该类还提供了几种将float
转换为String
和String
转换为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;
}