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


更多源码分析,请点击


Float

Float 类将基本类型 float 的值包装在对象中。 Float 类型的对象包含一个类型为 float 的属性。

另外,提供了几种将 float 转换为 StringString 转换为 float 的方法,以及其他在处理 float 类型时有用的方法。

Float 类被 final 关键字修饰,不能被继承。Float 类继承自 Number 类,实现了 ComparableConstableConstantDesc 接口。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 为静态常量,基本类型 floatClass 对象。

toString(float)

返回 float 参数的字符串表示形式。

  • 如果参数为NaN,则结果为字符串“ NaN”。
  • 否则,结果是一个字符串,代表参数的符号和大小(绝对值)。如果符号为负,则结果的第一个字符为’-’(’ u002D’);如果符号为正,则结果中不显示符号字符。至于大小m:
  • 如果m为无穷大,则用字符“ Infinity”表示;因此,正无穷大产生结果“无穷大”,而负无穷大产生结果“-无穷大”。
  • 如果m为零,则用字符“ 0.0”表示;因此,负零产生结果“ -0.0”,而正零产生结果“ 0.0”。
复制代码
1
2
3
4
public static String toString(double d) { return FloatingDecimal.toJavaFormatString(d); }

toString()

将该对象的值以字符串形式返回。

复制代码
1
2
3
4
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() 方法实现。这里通过正则表达式匹配,关于正则表达式点此了解详情
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 对象。

复制代码
1
2
3
4
public static Float valueOf(float f) { return new Float(f); }

valueOf(String)

将字符串 s 转为 Float 对象。

调用 parseFloat(String) 方法先将字符串 s 转为 Float 类型,然后调用 Float 类的构造方法实现。

复制代码
1
2
3
4
public static Float valueOf(String s) throws NumberFormatException { return new Float(parseFloat(s)); }

parseFloat(String)

将字符串 s 转换为 float 类型的值。 调用 FloatingDecimal.parseFloat(String) 方法实现。

复制代码
1
2
3
4
public static float parseFloat(String s) throws NumberFormatException { return FloatingDecimal.parseFloat(s); }

isNaN(float)

如果浮点数 v 是NaN,则返回true,否则,返回false。

复制代码
1
2
3
4
public static boolean isNaN(float v) { return (v != v); }

isNaN()

如果该对象的值是否是 NaN,则返回true,否则,返回false。

复制代码
1
2
3
4
public boolean isNaN() { return isNaN(value); }

isInfinite(float)

如果浮点数 v 是无穷,则返回true,否则,返回false。

复制代码
1
2
3
4
public static boolean isInfinite(float v) { return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY); }

isFinite(float)

如果该浮点数的绝对值小于浮点数最大值 MAX_VALUE ,则返回true,否则,返回false(无穷大或者NaN)。

复制代码
1
2
3
4
public static boolean isFinite(float f) { return Math.abs(f) <= Float.MAX_VALUE; }

isInfinite()

如果该对象的值是无穷,则返回true,否则,返回false。

复制代码
1
2
3
4
public boolean isInfinite() { return isInfinite(value); }

byteValue()shortValue()intValue()longValuefloatValue()doubleValue() 等方法实现简单,不再赘述。

hashCode(float)

返回浮点数 value 的哈希值。将 value 数据按 bit 转为16进制形式即为哈希值。

复制代码
1
2
3
4
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)),返回指定浮点值的表示形式。(不了解该标准的可以点击链接了解详情)

复制代码
1
2
3
4
5
6
7
public static int floatToIntBits(float value) { if (!isNaN(value)) { return floatToRawIntBits(value); } return 0x7fc00000; }

floatToRawIntBits(float)

本地静态方法doubleToLongBits(float) 方法的具体实现,具体功能一致。该方法在本地采用C/C++实现。

复制代码
1
2
public static native int floatToRawIntBits(float value);

hashCode()

返回当前对象的哈希值。

复制代码
1
2
3
4
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。

复制代码
1
2
3
4
5
public boolean equals(Object obj) { return (obj instanceof Float) && (floatToIntBits(((Float)obj).value) == floatToIntBits(value)); }

intBitsToFloat(int)

本地静态方法,返回对应于给定位表示形式的 float 值。根据IEEE 754浮点“双格式”位布局,该参数被认为是浮点值的表示。

复制代码
1
2
public static native float intBitsToFloat(int bits);

compare(float, float)

比较给定的两个浮点值的大小。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)

比较当前对象和指定对象的大小。

复制代码
1
2
3
4
public int compareTo(Float anotherFloat) { return Float.compare(value, anotherFloat.value); }

sum(double, double)max(double, double)min(double, double) 等方法实现简单,不再赘述。

describeConstable()

Constable 接口中的方法。点此了解详情。

复制代码
1
2
3
4
5
@Override public Optional<Float> describeConstable() { return Optional.of(this); }

resolveConstantDesc(MethodHandles.Lookup)

ConstantDesc 接口中的方法,点此了解详情。

复制代码
1
2
3
4
5
@Override public Float resolveConstantDesc(MethodHandles.Lookup lookup) { return this; }

更多源码分析,请点击

最后

以上就是辛勤手套最近收集整理的关于java源码分析---Float类(JDK14)的全部内容,更多相关java源码分析---Float类(JDK14)内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部