[七]基础数据类型之Float详解
Float 基本数据类型float 的包装类
Float 类型的对象包含⼀个 float 类型的字段
属性简介
⽤来以⼆进制补码形式表⽰ float 值的⽐特位
数
public static final int SIZE = 32;
⼆进制补码形式表⽰ float 值的字节数public static final int BYTES = SIZE / Byte.SIZE;
表⽰基本类型 float 的 Class 实例public static final Class<Float> TYPE = (Class<Float>) PrimitiveClass("float");
能够表⽰的最⼤值
只有标准化⼀种形式,也就是前⽂提到过的
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;正⽆穷
它等于 Float.intBitsToFloat(0x7f800000) 返
回的值
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
负⽆穷
它等于 Float.intBitsToFloat(0xff800000) 返
回的值
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
NaN
not a number
它等于 Float.intBitsToFloat(0x7fc00000) 返
回的值
public static final float NaN = 0.0f / 0.0f;
指数真值的有效的最⼤值public static final int MAX_EXPONENT = 127;
指数真值的有效的最⼩值public static final int MIN_EXPONENT = -126;
这些属性,看过上⼀篇浮点数简介的话,可以很清晰的理解
构造⽅法
Float 依然提供了根据基本类型float以及float的String形式构造
String形式依然借助于parseXXX形式 parseFloat
另外,也提供了根据基本类型double进⾏构造的⽅式,内部直接强转
Float(float value)
Float(String s)
Float(double value)直接强转
常⽤⽅法
对于浮点数,有⼀些额外的属性⽅法
我们浮点数介绍中,对于浮点数的表⽰形式进⾏了介绍
Float提供了对于指定值的表⽰形式的获取⽅法, 这表⽰形式也就是是⼀个32位的⼆进制位序列Float 获取表⽰形式
对于获取表⽰形式提供了两种形式的⽅法,主要是针对于⾮数字的NaN的不同表⽰
他们可以与intBitsToFloat 可以进⾏互相转换
floatToRawIntBits 如果参数为正⽆穷⼤,则结果为 0x7f800000
如果参数为负⽆穷⼤,则结果为 0xff800000
如果参数为 NaN,则结果是表⽰实际 NaN 值的整数
与 floatToIntBits ⽅法不同,floatToRawIntBits 不压缩所有将 NaN 编码为⼀个“规范”NaN 值的位模式。
在所有情况下,结果都是⼀个整数,将其赋予 intBitsToFloat(int) ⽅法将⽣成⼀个与 floatToRawIntBits 的参数相同的浮点值
本地⽅法
floatToIntBits 如果参数为正⽆穷⼤,则结果为 0x7f800000
如果参数为负⽆穷⼤,则结果为 0xff800000
如果参数为 NaN,则结果为 0x7fc00000
在所有情况下,结果都是⼀个整数
将其赋予 intBitsToFloat(int) ⽅法将⽣成⼀个浮点值,该浮点值与 floatToIntBits 的参数相同(⽽所有 NaN 值则会⽣成⼀个“规范”NaN 值)
依赖floatToRawIntBits
将表⽰形式转换为Float,返回对应于给定位表⽰形式的 float 值
本地⽅法
其实就是按照布局计算float
如果参数为 0x7f800000,则结果为正⽆穷⼤
如果参数为 0xff800000,则结果为负⽆穷⼤
如果参数值在 0x7f800001 到 0x7fffffff 或在 0xff800001 到 0xffffffff 之间,则结果为 NaN Java 提供的任何 IEEE 754 浮点操作都不能区分具有不同位模式的两个同类型 NaN 值不同的 NaN 值只能使⽤ Float.floatToRawIntBits ⽅法区分
浮点数有⼏种特殊的表⽰,⽐如⽆穷 NaN等
额外的,也提供了⼀些相关的⽅法
static boolean isNaN(float v)静态⽅法
是否⼀个⾮数字 (NaN) 值⾮数值 true
static boolean isFinite(float f)静态⽅法
是否是有限的浮点数有限的true
static boolean isInfinite(float v)静态⽅法
是否是⽆穷⼤是⽆穷⼤ true
boolean isInfinite()实例⽅法
依赖静态⽅法浮点型变量float
boolean isNaN()实例⽅法
依赖静态⽅法
⽐较
static int compare(float f1, float f2)静态⽅法
⽐较两个float f1 < f2 ⼩于0 f1 = f2 等于0 f1 > f2 ⼤于0
int compareTo(Float anotherFloat)实例⽅法
两个对象进⾏⼤⼩⽐较,依赖于静态⽅法parseXXX系列
字符串解析为基本类型,
不需要对象,所以都是静态⽅法
返回⼀个字符串形式表⽰的基本类型float
表现效果同valueOf(String),不过valueOf 返回的是对象
如果String是null或者不包含可以解析的字符串将会抛出异常
底层依赖sun.misc.FloatingDecimal
valueOf系列
把基本基本类型包装为对象
⽤来创建获得对象,所以⽆需对象,全都是静态⽅法
不同于之前介绍的整数数值,他们都有缓冲
float不存在缓存,valueOf也是直接new 对象
static Float valueOf(float f)
static Float valueOf(String s)依赖parseFloat⽅法
所以上⾯说跟valueOf(String)表现效果相同,本⾝就是⼀样
Float没有 decode⽅法
XXXValue系列
类似之前介绍的其他数值类型全部都是强转内部的 value return (XXX)value;byteValue() shortValue() intValue() longValue() floatValue() doubleValue()
toString toXXXString 系列
static String toString(float f)静态⽅法
String toString()实例⽅法
内部调⽤ static String toString(float f)
静态⽅法
static String toHexString(float f)返回 float 参数的⼗六进制字符串表⽰形式toString系列好像没什么好说的,⼜好像有很多要说的
⽤到的时候对于格式字符的规定有疑惑直接查看API
equals
boolean equals(Object obj) 将此对象与指定对象进⾏⽐较
当且仅当参数不是 null ⽽是 Float 对象,且表⽰的 float 值与此对象表⽰的 float 值相同时,结果为true
为此,当且仅当将⽅法 #floatToLongBits(double) 应⽤于两个值所返回的 int 值相同时,才认为这两个 float 值相同
注意,在⼤多数情况下,对于 Float 类的两个实例 f1 和 f2,当且仅当
f1.floatValue() == f2.floatValue()
的值为 true 时,f1.equals(f2) 的值才为 true。但是,有以下两种例外情况:
如果 f1 和 f2 都表⽰ Float.NaN,那么即使 Float.NaN==Float.NaN 的值为 false,equals ⽅法也将返回 true
所以此处使⽤的是floatToIntBits,⽽不是raw的
如果 f1 表⽰ +0.0f,⽽ f2 表⽰ -0.0f,或相反,那么即使 0.0f==-0.0f 的值为 true,equal 测试也将返回 false
该定义使得哈希表得以正确操作。
hashCode
static int hashCode(float value)静态⽅法
获得⼀个value的hashcode值
int hashCode()实例⽅法
依赖静态⽅法
其他⽅法
sum(float, float)
max(float, float)
min(float, float)
总结
其实浮点数的表⽰形式与使⽤规范才是重点
Float只是float的包装,float也只是IEEE754 标准的⼀个实现,根本还是在于标准的理解
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论