前面几篇文章我们看了JAVA基本数据类型整型的包装类,接下来我们看下浮点型float的包装类Float类。
基础知识:
1.IEEE 754:
IEEE 754是一个标准,该标准定义了浮点数的格式还有一些特殊值,它规定了计算机中二进制与十进制浮点数转换的格式及方法。规定了四种表示浮点数值的方法,单精确度(32位)、双精确度(64位)、延伸单精确度(43位以上)与延伸双精确度(79位以上)。JAVA语言支持这里的单精确度float,与双精确度double。
2.无穷大:
JAVA中用Infinity表示正无穷大,任何有限正数除以0为正无穷大,正无穷的值为0x7f800000。用-Infinity表示负无穷大,任何有限负数除以0为负无穷的,负无穷的值为0xff800000。
3.NAN:
不是一个数(not a number ),NaN 用来表示处理计算中出现的错误情况,比如0除以0或负数平方根。
主要属性:
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;
public static final float MIN_NORMAL = 0x1.0p-126f;
public static final float MIN_VALUE = 0x0.000002P-126f;
public static final int MAX_EXPONENT = 127;
public static final int MIN_EXPONENT = -126;
POSITIVE_INFINITY 表示正无穷大,其值为0x7f800000。
NEGATIVE_INFINITY 表示负无穷大,其值为0xff800000。
NaN 表示计算出错的情况,NaN 实际上是一个数,而是一族数。
MAX_VALUE最大的浮点数值,其值为3.4028235E38,即2的127次方。
MIN_NORMAL 用来表示最小标准值,它定义为0x1.0p-126f,这里其实就是2的-126次方的了,值为1.17549435E-38f。
MIN_VALUE 最小的浮点数值,其值为1.4e-45f。
MAX_EXPONENT用来表示指数的最大值,这里定为127。
MIN_EXPONENT 用来表示指数的最小值,这里定为-126。
toString(float f):
public static String toString(float f) {
return FloatingDecimal.toJavaFormatString(f);
}
通过FloatingDecimal类的toJavaFormatString方法转成字符串。它处理的过程是先将浮点数转成IEEE-754标准的二进制形式,并且还要判断是否是正负无穷大,是否是NaN。然后再按照IEEE-754标准从二进制转换成十进制,最后生成浮点数对应的字符串。
toHexString(float f) :
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转换成16进制表示的形式,这里先会判断下目标数f,如果是NaN则返回字符串"NaN",如果是正无穷大,则返回Infinity。如果是负无穷大则返回-Infinity。如果f为0,则用返回"0x0.0p0",-0则返回"-0x0.0p0"。如果f是具有标准化表示形式的float值,则使用子字符串表示有效位数和指数。有效位数用字符串"0x1."表示,后跟该有效位数小数部分的小写十六进制表示形式。除非所有位数都为0,否则移除十六进制表示形式中的尾部0,在所有位数为0的情况下,可以用一个0表示,然后用"p"表示指数,后跟无偏指数的十进制字符串,该值与对指数值调用Integer.toString生成的值相同。如果f是具有subnormal表示形式的float值,则用字符"0x0."表示有效位数,后跟该有效位数小数部分的十六进制表示形式,移除十六进制表示形式中的尾部0,然后用"p-126"表示指数。注意,在subnormal有效位数中,必须至少有一个非0位数。(网上摘的,我也看不大懂)
valueOf
public static Float valueOf(String s) throws NumberFormatException {
return new Float(parseFloat(s));
}
public static Float valueOf(float f) {
return new Float(f);
}
返回对应浮点数的Float对象,可以看到在Float类中没有像Byte或是Integer类那样将常用的数存放到缓存池中。这里是直接创建对象,然后返回。
parseFloat(String s) :
public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.parseFloat(s);
}
通过调用FloatingDecimal的parseFloat方法来实现对字符串的转换.这里会先判断s是否为NaN,Infinity,-Infinity等数。如果是以0x打头则会按16进制转换为10进制转换。判断是否包含了E字符,即是否是科学计数法,如果有则需要处理。
isNaN:
public static boolean isNaN(float v) {
return (v != v);
}
判断一个数是否是NaN,该方法逻辑很简单,直接判断一个数是否与自己相等,因为规定一个NaN与任何值都不相等,包括它自己。这部分逻辑在JVM中会做,这里直接通过比较来判断就可以了。
isInfinite
public static boolean isInfinite(float v) {
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
判断一个数是否为无穷数,无穷大POSITIVE_INFINITY或无穷小NEGATIVE_INFINITY。
isFinite:
public static boolean isFinite(float f) {
return Math.abs(f) <= FloatConsts.MAX_VALUE;
}
判断一个数是否为有穷数。绝对值(Math.abs(f)是用来获取一个数的绝对值的)小于FloatConsts.MAX_VALUE的数则为有穷数,FloatConsts.MAX_VALUE的值为3.4028235e+38f,它其实与Float类中定义的MAX_VALUE相同。
floatToRawIntBits:
public static native int floatToRawIntBits(float value);
floatToRawIntBits是一个本地方法,该方法主要是将一个浮点数转成IEEE 754标准的二进制形式对应的整型数。用其它语言实现。
floatToIntBits:
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;
}
该方法主要先通过调用floatToRawIntBits获取到IEEE 754标准对应的整型数,然后再分别用FloatConsts.EXP_BIT_MASK和FloatConsts.SIGNIF_BIT_MASK两个掩码去判断是否为NaN,0x7fc00000对应的即为NaN。
intBitsToFloat:
public static native float intBitsToFloat(int bits);
该方法与floatToRawIntBits方法对应,intBitsToFloat同样是一个本地方法,该方法主要是将一个IEEE 754标准的二进制形式对应的整型数转成一个浮点数。用其它语言实现。
sum:
public static float sum(float a, float b) {
return a + b;
}
计算两个浮点数的和。
max:
public static float max(float a, float b) {
return Math.max(a, b);
}
取两个浮点数中较大的一个。
min:
public static float min(float a, float b) {
return Math.min(a, b);
}
取两个浮点数中较小的一个。
查看所有目录