Float解析 常用方法 解析 内部原理实现 Float数值范围大小 表示形式

 

 

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>) Class.getPrimitiveClass("float");

能够表示的最大值

只有标准化一种形式,也就是前文提到过的

​​[七]基础数据类型之Float详解_静态方法_02​​

public

static final float MAX_VALUE = 0x1.fffffeP+127f;


标准化的最小值

​​[七]基础数据类型之Float详解_静态方法_03​​

public

static final float MIN_NORMAL = 0x1.0p-126f;

最小值还有非标准化的形式

​​[七]基础数据类型之Float详解_静态方法_04​​

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详解_静态方法_05​​

Float(String

s)

​​[七]基础数据类型之Float详解_浮点数_06​​

Float(double

value)

直接强转

​​[七]基础数据类型之Float详解_静态方法_07​​

 

常用方法

对于浮点数,有一些额外的属性方法

我们浮点数介绍中,对于浮点数的表示形式进行了介绍

​​[七]基础数据类型之Float详解_静态方法_08​​

Float提供了对于指定值的表示形式的获取方法, 这表示形式也就是是一个32位的二进制位序列

 

Float

获取表示形式

对于获取表示形式 提供了两种形式的方法,主要是针对于非数字的NaN的不同表示

他们可以与intBitsToFloat

可以进行互相转换


将表示形式转换为Float,返回对应于给定位表示形式的

float 值

本地方法

其实就是按照布局计算float

​​[七]基础数据类型之Float详解_浮点数_09​​

如果参数为 0x7f800000,则结果为正无穷大

如果参数为 0xff800000,则结果为负无穷大

如果参数值在 0x7f800001 到 0x7fffffff 或在 0xff800001 到 0xffffffff 之间,则结果为 NaN

 

Java 提供的任何 IEEE 754 浮点操作都不能区分具有不同位模式的两个同类型 NaN 值

不同的 NaN 值只能使用 Float.floatToRawIntBits 方法区分

floatToRawIntBits

如果参数为正无穷大,则结果为 0x7f800000

如果参数为负无穷大,则结果为 0xff800000

如果参数为 NaN,则结果是表示实际 NaN 值的整数

与 floatToIntBits 方法不同,floatToRawIntBits 不压缩所有将 NaN 编码为一个“规范”NaN 值的位模式。

 

在所有情况下,结果都是一个整数,将其赋予 intBitsToFloat(int) 方法将生成一个与 floatToRawIntBits 的参数相同的浮点值

 

本地方法

​​[七]基础数据类型之Float详解_基本类型_10​​

floatToIntBits

如果参数为正无穷大,则结果为 0x7f800000

如果参数为负无穷大,则结果为 0xff800000

如果参数为 NaN,则结果为 0x7fc00000

 

在所有情况下,结果都是一个整数

将其赋予 intBitsToFloat(int) 方法将生成一个浮点值,该浮点值与 floatToIntBits 的参数相同

(而所有 NaN 值则会生成一个“规范”NaN 值)

 

依赖floatToRawIntBits

​​[七]基础数据类型之Float详解_浮点数_11​​

 

浮点数有几种特殊的表示,比如 无穷 NaN等

额外的,也提供了一些相关的方法

 

static

boolean isNaN(float v)

静态方法

是否一个非数字

(NaN) 值

非数值 true

​​[七]基础数据类型之Float详解_基本类型_12​​

static

boolean isFinite(float f)

静态方法

是否是有限的浮点数

有限的true

​​[七]基础数据类型之Float详解_基本类型_13​​

static

boolean isInfinite(float v)

静态方法

是否是无穷大

是无穷大  true

​​[七]基础数据类型之Float详解_基本类型_14​​

boolean

isInfinite()

实例方法

依赖静态方法

​​[七]基础数据类型之Float详解_浮点数_15​​

boolean

isNaN()

实例方法

依赖静态方法

​​[七]基础数据类型之Float详解_浮点数_16​​

 

比较

static int

compare(float f1, float f2)

静态方法

比较两个float

f1

< f2 小于0

f1 = f2 等于0

f1 > f2 大于0

int

compareTo(Float anotherFloat)

实例方法

两个对象进行大小比较,依赖于静态方法

​​[七]基础数据类型之Float详解_基本类型_17​​

 

parseXXX系列

字符串解析 为 基本类型,

不需要对象,所以都是静态方法

​​[七]基础数据类型之Float详解_浮点数_18​​

返回一个字符串形式表示的基本类型float

表现效果同valueOf(String),不过valueOf

返回的是对象

如果String是null或者不包含可以解析的字符串将会抛出异常

底层依赖sun.misc.FloatingDecimal

​​[七]基础数据类型之Float详解_静态方法_19​​

 

 

valueOf系列

把基本基本类型 包装为对象

用来创建获得对象,所以无需对象,全都是静态方法

​​[七]基础数据类型之Float详解_浮点数_20​​

 

不同于之前介绍的整数 数值,他们都有缓冲

float不存在缓存,valueOf也是直接new 对象

static

Float valueOf(float f)

​​[七]基础数据类型之Float详解_基本类型_21​​

static

Float valueOf(String s)

依赖parseFloat方法

所以上面说跟valueOf(String)表现效果相同,本身就是一样

​​[七]基础数据类型之Float详解_静态方法_22​​

 

 

Float没有 decode方法

XXXValue系列

类似之前介绍的其他数值类型

全部都是强转内部的  value

return (XXX)value;

byteValue()

shortValue()

intValue()

longValue()

floatValue()

doubleValue()

toString  toXXXString  系列

static

String toString(float f)

静态方法

​​[七]基础数据类型之Float详解_浮点数_23​​

String

toString()

实例方法

内部调用  static String toString(float f)

​​[七]基础数据类型之Float详解_基本类型_24​​

static

String toHexString(float f)

静态方法

返回

float 参数的十六进制字符串表示形式

​​[七]基础数据类型之Float详解_基本类型_25​​

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

该定义使得哈希表得以正确操作。

​​[七]基础数据类型之Float详解_浮点数_26​​

hashCode

static int

hashCode(float value)

静态方法

获得一个value的hashcode值

​​[七]基础数据类型之Float详解_基本类型_27​​

int

hashCode()

实例方法

依赖静态方法

​​[七]基础数据类型之Float详解_静态方法_28​​

其他方法

sum(float,

float)

​​[七]基础数据类型之Float详解_静态方法_29​​

max(float,

float)

​​[七]基础数据类型之Float详解_基本类型_30​​

min(float,

float)

​​[七]基础数据类型之Float详解_静态方法_31​​

 

总结

其实浮点数的表示形式与使用规范才是重点

Float只是float的包装,float也只是IEEE754 标准的一个实现,根本还是在于标准的理解