我是靠谱客的博主 辛勤手套,这篇文章主要介绍java源码分析---Float类(JDK14),现在分享给大家,希望可以做个参考。


更多源码分析,请点击


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)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(281)

评论列表共有 0 条评论

立即
投稿
返回
顶部