[八]基礎數據類型之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提供的類與功能
相關文章
相關標籤/搜索