概述
更多源码分析,请点击
Float
Float 类将基本类型 float 的值包装在对象中。 Float 类型的对象包含一个类型为 float 的属性。
另外,提供了几种将 float 转换为 String 和 String 转换为 float 的方法,以及其他在处理 float 类型时有用的方法。
Float 类被 final 关键字修饰,不能被继承。Float 类继承自 Number 类,实现了 Comparable 、 Constable 、 ConstantDesc 接口。
public final class Float extends Number implements Comparable<Float>, Constable, ConstantDesc {
private final float value;
public static final float POSITIVE_INFINITY = 1.0f / 0.0;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0;
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;
public static final int SIZE = 32;
public static final int BYTES = SIZE / Byte.SIZE;
public static final Class<Float>
TYPE = (Class<Float>) Class.getPrimitiveClass("float");
}
value 为常量,用于保存 Float 对象所对应的基本类型 float 的值。
POSITIVE_INFINITY 为常量,表示正无穷。
NEGATIVE_INFINITY 为常量,表示负无穷。
NAN 为常量,表示值为 float 类型的非数字值。
MAX_VALUE 为常量,表示 float 类型的值所能表示的最大正数。(2-2-23)·2127
MIN_NORMAL 为常量,表示 float 类型标准浮点数的最小正数。2-126
MIN_VALUE 为常量,表示 float 类型的值所能表示的最小正数。2-149
MAX_EXPONENT 为常量,表示有限双精度变量可能具有的最大指数。
MIN_EXPONENT 为常量,表示归一化双精度变量可能具有的最小指数。
SIZE 为静态常量,用于表示二进制形式的 float 类型所需要的位数。
BYTES 为静态常量,用于表示二进制形式的 float 值所占的字节数。即8个字节。
TYPE 为静态常量,基本类型 float 的 Class 对象。
toString(float)
返回 float 参数的字符串表示形式。
- 如果参数为NaN,则结果为字符串“ NaN”。
- 否则,结果是一个字符串,代表参数的符号和大小(绝对值)。如果符号为负,则结果的第一个字符为’-’(’ u002D’);如果符号为正,则结果中不显示符号字符。至于大小m:
- 如果m为无穷大,则用字符“ Infinity”表示;因此,正无穷大产生结果“无穷大”,而负无穷大产生结果“-无穷大”。
- 如果m为零,则用字符“ 0.0”表示;因此,负零产生结果“ -0.0”,而正零产生结果“ 0.0”。
public static String toString(double d) {
return FloatingDecimal.toJavaFormatString(d);
}
toString()
将该对象的值以字符串形式返回。
public String toString() {
return Float.toString(value);
}
toHexString(float)
返回给定浮点数 f 的十六进制字符串表示形式。
如果浮点数 f 是标准化浮点数,即绝对值大于 MIN_NORMAL ,则直接调用 Double.toHexString(double) 方法,点击查看 Double 类源码分析了解详情
如果 f 是非标准化浮点数,即绝对值小于 MIN_NORMAL,即浮点数 f 的指数一定为 -126 。
- Math.scalb(double d, int scaleFactor) 的返回值为 d * 2scaleFactor 。在此调用即进行操作 f * 2-1022+126 (即结果为 f 的尾数乘以 2-1022 )。然后调用 Double.toHexString(double) 方法将浮点数转换为16进制表示的字符串。
- 由于上一步操作给乘了 2-1022 ,所以转换为字符串形式后指数为p-1022,需要将指数转换为p-126。调用 String.replaceFirst() 方法实现。这里通过正则表达式匹配,关于正则表达式点此了解详情
public static String toHexString(float f) {
if (Math.abs(f) < Float.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 */
Double.MIN_EXPONENT-
Float.MIN_EXPONENT));
return s.replaceFirst("p-1022$", "p-126");
}
else // double string will be the same as float string
return Double.toHexString(f);
}
valueOf(float)
将 float 类型的值转为 Float 对象。
public static Float valueOf(float f) {
return new Float(f);
}
valueOf(String)
将字符串 s 转为 Float 对象。
调用 parseFloat(String) 方法先将字符串 s 转为 Float 类型,然后调用 Float 类的构造方法实现。
public static Float valueOf(String s) throws NumberFormatException {
return new Float(parseFloat(s));
}
parseFloat(String)
将字符串 s 转换为 float 类型的值。 调用 FloatingDecimal.parseFloat(String) 方法实现。
public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.parseFloat(s);
}
isNaN(float)
如果浮点数 v 是NaN,则返回true,否则,返回false。
public static boolean isNaN(float v) {
return (v != v);
}
isNaN()
如果该对象的值是否是 NaN,则返回true,否则,返回false。
public boolean isNaN() {
return isNaN(value);
}
isInfinite(float)
如果浮点数 v 是无穷,则返回true,否则,返回false。
public static boolean isInfinite(float v) {
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
isFinite(float)
如果该浮点数的绝对值小于浮点数最大值 MAX_VALUE ,则返回true,否则,返回false(无穷大或者NaN)。
public static boolean isFinite(float f) {
return Math.abs(f) <= Float.MAX_VALUE;
}
isInfinite()
如果该对象的值是无穷,则返回true,否则,返回false。
public boolean isInfinite() {
return isInfinite(value);
}
byteValue() 、shortValue() 、 intValue() 、 longValue 、 floatValue() 、 doubleValue() 等方法实现简单,不再赘述。
hashCode(float)
返回浮点数 value 的哈希值。将 value 数据按 bit 转为16进制形式即为哈希值。
public static int hashCode(float value) {
return floatToIntBits(value);
}
floatToIntBits(float)
根据[IEEE 754浮点数标准]([https://baike.baidu.com/item/IEEE%20754/3869922?fr=aladdin](https://baike.baidu.com/item/IEEE 754/3869922?fr=aladdin)),返回指定浮点值的表示形式。(不了解该标准的可以点击链接了解详情)
public static int floatToIntBits(float value) {
if (!isNaN(value)) {
return floatToRawIntBits(value);
}
return 0x7fc00000;
}
floatToRawIntBits(float)
本地静态方法,doubleToLongBits(float) 方法的具体实现,具体功能一致。该方法在本地采用C/C++实现。
public static native int floatToRawIntBits(float value);
hashCode()
返回当前对象的哈希值。
public int hashCode() {
return Float.hashCode(value);
}
equals(Object)
将此对象与指定对象进行比较。 当且仅当参数不为null且是一个 Float 对象,floatToIntBits(float) 方法在应用于每个值时返回相同的 int 值时,才将两个 float 值视为相同。
如果d1和d2都表示 NaN ,则即使 NaN == NaN的值为false,equals方法也将返回true。
如果d1表示+0.0,而d2表示-0.0,反之亦然,即使+0.0 ==-0.0的值为true,相等测试的值为false。
public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
intBitsToFloat(int)
本地静态方法,返回对应于给定位表示形式的 float 值。根据IEEE 754浮点“双格式”位布局,该参数被认为是浮点值的表示。
public static native float intBitsToFloat(int bits);
compare(float, float)
比较给定的两个浮点值的大小。
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)
}
compareTo(Float)
比较当前对象和指定对象的大小。
public int compareTo(Float anotherFloat) {
return Float.compare(value, anotherFloat.value);
}
sum(double, double) 、 max(double, double) 、 min(double, double) 等方法实现简单,不再赘述。
describeConstable()
Constable 接口中的方法。点此了解详情。
@Override
public Optional<Float> describeConstable() {
return Optional.of(this);
}
resolveConstantDesc(MethodHandles.Lookup)
ConstantDesc 接口中的方法,点此了解详情。
@Override
public Float resolveConstantDesc(MethodHandles.Lookup lookup) {
return this;
}
更多源码分析,请点击
最后
以上就是辛勤手套为你收集整理的java源码分析---Float类(JDK14)的全部内容,希望文章能够帮你解决java源码分析---Float类(JDK14)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复