閱讀432 返回首頁    go 支付寶


Java double取值範圍及Double的MAX_VALUE和MIN_VALUE

項目需要用一個特殊標識來表示用戶未輸入值,值類型為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;

懵B良久之後,在https://www.apihome.cn/api/java/Double.html找到了答案。

根據 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(同理,float也是)在計算機中的表示方式和int、long等不同,因此它才可以表示的如此大範圍的數。順帶提一句,Double裏的最小值是非0非負的最小值,需要最小值隻需 -MAX_VALUE即可,負的最大值是-MIN_VALUE。

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

其實,方案C是一個很好的方案,即使用Double來表示,但是需要做一些改變,如果getDouble方法獲取到的值是0時,那就需要用getString方法來校驗數據庫值,若為null,則Double為null;若不為null,則表示用戶確實設置的是0。

本著學習和分享的態度,買一送一,再來個知識點。
這裏寫圖片描述
注:圖片中內容摘自《Java編程思想》

最後更新:2017-06-23 23:36:05

  上一篇:go  《深入理解Elasticsearch(原書第2版)》一2.4.1 過濾及查詢相關性
  下一篇:go  phpcms v9 各種注入漏洞補丁