[八]基础数据类型之Double详解

Double 基本数据类型double  的包装类
Double 类型的对象包含一个 double 类型的字段
image_5bbc0d42_356e
 

属性简介

用来以二进制补码形式表示 double 值的比特位数 public static final int SIZE = 64;
二进制补码形式表示 double 值的字节数 public static final int BYTES = SIZE / Byte.SIZE;
表示基本类型 double 的 Class 实例 public static final Class<Double>   TYPE = (Class<Double>) Class.getPrimitiveClass("double");
可以表示的最大值
只有标准化一种形式,也就是前文提到过的
image_5bbc0d42_caa
public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; 
标准化的最小值
image_5bbc0d42_27a0
public static final double MIN_NORMAL = 0x1.0p-1022;
最小值还有非标准化的形式
image_5bbc0d42_4fe1
public static final double MIN_VALUE = 0x0.0000000000001P-1022;
正无穷
等同于Double.longBitsToDouble(0x7ff0000000000000L)
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
负无穷
等同于Double.longBitsToDouble(0xfff0000000000000L).
public static final double NEGATIVE_INFINITY = -1.0 / 0.0
NaN
not a number
等同于Double.longBitsToDouble(0x7ff8000000000000L) 
public static final double NaN = 0.0d / 0.0
指数真值的有效的最大值 public static final int MAX_EXPONENT = 1023
指数真值的有效的最小值 public static final int MIN_EXPONENT = -1022
 
这些属性,看过浮点数简介的话,能够很清晰的理解,再次说明下,但凡本人的系列文章,所有都是有顺序的     

构造方法

Double 依然提供了根据基本类型double以及double的String形式构造
String形式依然借助于parseXXX形式 parseDouble
Double(double value) image_5bbc0d42_71a2
Double(String s) image_5bbc0d42_4304

经常使用方法

对于浮点数,有一些额外的属性方法
咱们浮点数介绍中,对于浮点数的表示形式进行了介绍
image_5bbc0d42_625a
Double提供了对于指定值的表示形式的获取方法, 这表示形式也就是是一个64位的二进制位序列
 
Double 获取表示形式
对于获取表示形式 提供了两种形式的方法,主要是针对于非数字的NaN的不一样表示

他们能够与longBitsToDouble 能够进行互相转换
doubleToRawLongBits(double)
根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值
若是参数是正无穷大,则结果为 0x7ff0000000000000L
若是参数是负无穷大,则结果为 0xfff0000000000000L
若是参数是 NaN,则结果是表示实际 NaN 值的 long 整数
 
与 doubleToLongBits 方法不一样
doubleToRawLongBits 并无将 NaN 编码为一个“规范的”NaN 值
 
在全部状况下,结果都是一个 long 整数
将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToRawLongBits 的参数相同的浮点值
 
 
本地方法
image_5bbc0d42_6397
doubleToLongBits(double)
根据 IEEE 754 浮点双精度格式 ("double format") 位布局,返回指定浮点值的表示形式
 
若是参数是正无穷大,则结果为 0x7ff0000000000000L
若是参数是负无穷大,则结果为 0xfff0000000000000L
若是参数是 NaN,则结果为 0x7ff8000000000000L
 
在全部状况下,结果都是一个 long 整数
将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToLongBits 的参数相同的浮点值
(全部 NaN 值被压缩成一个“规范”NaN 值时除外)
 
也就是NaN的处理不同,此方法将NaN所有规范化为指定固定的值
 
依赖  doubleToRawLongBits
image_5bbc0d42_3511
longBitsToDouble(long)
返回对应于给定位表示形式的 double 值

若是参数是 0x7ff0000000000000L,则结果为正无穷大
若是参数是 0xfff0000000000000L,则结果为负无穷大
若是参数值在 0x7ff0000000000001L 到 0x7fffffffffffffffL 之间或者在 0xfff0000000000001L 到 0xffffffffffffffffL 之间,则结果为 NaN
 
 
浮点数有几种特殊的表示,好比 无穷 NaN等
额外的,也提供了一些相关的方法
 
static boolean isNaN(double v) 静态方法
是否一个非数字 (NaN) 值
非数值 true
image_5bbc0d42_2842
static boolean isFinite(double d) 静态方法
是不是有限的浮点数
有限的true
image_5bbc0d42_2240
static boolean isInfinite(double v) 静态方法
是不是无穷大
是无穷大  true
image_5bbc0d42_5a46
boolean isInfinite() 实例方法
依赖静态方法
image_5bbc0d42_1e28
boolean isNaN()
实例方法
依赖静态方法
image_5bbc0d42_34d6
 
比较
static int compare(double d1, double d2) 静态方法
比较两个double
d1 < d2 小于0
d1 = d2 等于0
d1 > d2 大于0
int compareTo(Double anotherDouble) 实例方法
两个对象进行大小比较,依赖于静态方法
image_5bbc0d42_5464
 

parseXXX系列

字符串解析 为 基本类型,
不须要对象,因此都是静态方法
image_5bbc0d42_28d1
返回一个字符串形式表示的基本类型double
表现效果同valueOf(String),不过valueOf 返回的是对象
若是不包含能够解析的字符串将会抛出异常
底层依赖sun.misc.FloatingDecimal
image_5bbc0d42_1d10

 

valueOf系列    

把基本基本类型 包装为对象
用来建立得到对象,因此无需对象,全都是静态方法
image_5bbc0d42_6c31
 
不一样于以前介绍的整数 数值,他们都有缓冲
Double v不存在缓存,valueOf也是直接new 对象
static Double valueOf(double d) image_5bbc0d42_39df
static Double valueOf(String s) 依赖parseDouble方法
因此上面说跟valueOf(String)表现效果相同,自己就是同样
image_5bbc0d42_2394
 

Double没有 decode方法

XXXValue系列

相似以前介绍的其余数值类型
所有都是强转内部的  value
return (XXX)value;
byteValue()
shortValue()
intValue()
longValue()
floatValue()
doubleValue()
 

toString  toXXXString  系列

toString(double)
toString()
toHexString(double)
 
static String toString(double d) 静态方法
image_5bbc0d42_2268
String toString() 实例方法
内部调用  static String toString(double d)
image_5bbc0d42_1586
static String toHexString(double d) 静态方法
返回 double参数的十六进制字符串表示形式
API帮助文档中对于字符的转换有明确的规定,能够仔细研究下

示例
image_5bbc0d42_430f
toString系列好像没什么好说的,又好像有不少要说的
用到的时候对于格式字符的规定有疑惑直接查看API

equals

boolean equals(Object obj) 
将此对象与指定对象比较
当且仅当参数不是 null 而是 Double 对象,且表示的 Double 值与此对象表示的 double 值相同时,结果为 true
为此,当且仅当将方法 doubleToLongBits(double) 应用于两个值所返回的 long 值相同时,才认为这两个 double 值相同
注意,在大多数状况下,对于 Double 类的两个实例 d1 和 d2,当且仅当
   d1.doubleValue() == d2.doubleValue()
为 true 时,d1.equals(d2) 的值才为 true
 
可是,有如下两种例外状况:
 
若是 d1 和 d2 都表示 Double.NaN,那么即便 Double.NaN==Double.NaN 值为 false,equals 方法也将返回 true
若是 d1 表示 +0.0 而 d2 表示 -0.0,或者相反,那么即便 +0.0==-0.0 值为 true,equals 测试也将返回 false
此定义使得哈希表得以正确操做
 
image_5bbc0d43_411
 

hashCode

static int hashCode(double value) 静态方法
得到一个value的hashcode值
image_5bbc0d43_4f6e
int hashCode() 实例方法
依赖静态方法
image_5bbc0d43_de9

其余方法

sum(double, double) image_5bbc0d43_5ab4
max(double, double) image_5bbc0d43_5dd1
min(double, double) image_5bbc0d43_516d
 

总结

其实浮点数的表示形式与使用规范才是重点
就像Float似的, Double只是double的包装,double也只是IEEE754 标准的一个实现,根本仍是在于标准的理解
Double  和 Float 提供的方法结构基本上是同样的,毕竟都是浮点数,标准也都是IEEE754 
 
至此,已经介绍了,基本类型包装类中的数值部分
也就是Byte  Short  Integer Long Float Double   他们做为数值有不少相似的方法
这些相似的方法属性也能够说是做为数值类型的共性
我的认为,找到共性可以更好理解运用 java提供的类与功能
相关文章
相关标签/搜索