1. 程式人生 > >JAVA_double取值範圍及MAX_VALUE和MIN_VALUE的總結

JAVA_double取值範圍及MAX_VALUE和MIN_VALUE的總結

關於Java double取值範圍及Double的MAX_VALUE和MIN_VALUE的總結

轉載於:http://blog.csdn.net/yangfangjit/article/details/72890779

專案需要用一個特殊標識來表示使用者未輸入值,值型別為double,一般方案如下: 
方案A: 使用double的最大值或者最小值; 
方案B: 正無窮、負無窮、NaN(考慮到數值要儲存資料庫,所以就放棄了); 
方案C: 改用包裝類Double,null表示使用者未輸入(使用的是JdbcTemplate, 當從資料庫取出的值為null時,getDouble會返回0而不是null)。

於是,初步決定使用方案A,深入之後,發現更大的問題,Java Double類中定義的最大值和最小值遠超64位所能表示的範圍,JDK中Double 定義的部分常量值如下: 
public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308 
public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308 
public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324 
public static final double POSITIVE_INFINITY = 1.0 / 0.0; 
public static final double NEGATIVE_INFINITY = -1.0 / 0.0; 
public static final double NaN = 0.0d / 0.0;

根據 IEEE 754 浮點“雙精度格式”位佈局,返回指定浮點值的表示形式,並保留 NaN 值。 第 63 位(掩碼 
0x8000000000000000L 選定的位)表示浮點數的符號。第 62-52 位(掩碼 0x7ff0000000000000L 
選定的位)表示指數。第 51-0 位(掩碼 0x000fffffffffffffL 選定的位)表示浮點數的有效數字(有時也稱為尾數)。

Java double的表示範圍不是-2^63–(2^63)-1,同理float。以double為例,最高位為符號位,62-52位為指數位,51-0位為尾數,或者稱有效數字位。

這裡寫圖片描述
注:圖片引自《維基百科》

由此可見double在計算機中的表示方式和int、long等不同,因此它才可以表示的如此大範圍的數。順帶提一句,Double裡的最小值是非0非負的最小值,需要最小值只需 -MAX_VALUE即可,負的最大值是-MIN_VALUE。

回到選什麼樣的方案來解決問題,最大值和最小值似乎可以,但是如此之大的資料儲存到資料庫也是一個及其複雜的問題,於是我們商議選擇一個特殊的值(-123456789)來表示使用者未輸入。

其實,方案C是一個很好的方案,即使用Double來表示,但是需要做一些改變,先用getString方法來獲取資料庫值,若為null,則Double為null;若不為null,則使用getDouble來獲取改值。

本著學習和分享的態度,買一送一,再來個知識點。 
這裡寫圖片描述
注:引自《Java程式設計思想》