[七]基础数据类型之Float详解
程序员文章站
2023-04-06 21:36:45
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"); |
能够表示的最大值 只有标准化一种形式,也就是前文提到过的 |
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 可以进行互相转换
|
||||
将表示形式转换为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() | 实例方法 依赖静态方法 |
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
标准的一个实现,根本还是在于标准的理解
上一篇: [六]基础数据类型之浮点数简介