[八]基礎數據類型之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提供的類與功能
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM