2009-10-30 29 views
20

Java中float和double的包含範圍是什麼?Java中float和double的包含範圍是什麼?

爲什麼不建議float或double用於精度要求嚴格的任何事情?

+4

引用了關於不使用float或double的特別之處在於句話 「爲重要的東西」? – 2009-10-30 15:35:02

+6

你在標題和正文中提出了兩個不同的問題。一次提出一個問題,並花時間寫一個完整的問題。 – GEOCHET 2009-10-30 15:48:46

+1

是的,但'不確切'並不意味着'不重要'。如果某些內容對性能至關重要,而不是精確至關重要,那麼浮點是比BigDecimal更好的選擇。 – Joren 2009-10-30 15:49:53

回答

20

Java的Double類的成員包含該類型的最小值和最大值。

2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double. 

退房的DoubleMin_VALUEMAX_VALUE靜態最終成員。 (一些)人們會建議不要將浮點類型用於準確性和精確性至關重要的事情,因爲舍入錯誤可能會通過可測量(小)量來推斷計算。

+8

不要忘記,一些數字只是不能用浮點數或雙精度表示。標準的例子是想象一個銀行應用程序,你從2.00美元撤回1.10美元。使用雙打的結果是$ 0。899999999999999,由於類似能力代表1.1在雙倍。 – 2009-10-30 16:25:16

+1

...這就是爲什麼你應該總是使用BigDecimal來表示貨幣類型(或者更一般的意義上,精確的小數)。 – 2009-10-30 17:03:37

+5

@dtsazza - 不需要使用BigDecimal,您也可以使用整數類型,並以美分(而非分數美元)表示數字。關鍵是你不能因爲精度有限而使用float或double來賺錢。 – Jesper 2009-10-30 22:18:59

3

當然,您可以使用浮點數或雙精度來處理「關鍵」的事情......許多應用程序除了使用這些數據類型關鍵字之外什麼也不做。

您可能會誤解某些關於浮點數的警告,例如建議不要使用compare for exact equality等等。

5

Primitives Data Types

  • float:float數據類型是單精度32位IEEE 754 浮點。其值範圍是 超出了本討論的範圍, ,但在Java語言規範的部分4.2.3 中指定。至於 與byteshort的建議,使用(而不是 double)一float如果你需要節省內存 浮點 很多大的數組。此數據類型不應使用 作爲精確值,例如 貨幣。爲此,您需要 而不是使用java.math.BigDecimal 類。 Numbers and Strings涵蓋了BigDecimal和 其他有用的類,由 Java平臺提供。

  • double:本double數據類型是雙精度64位IEEE 754 浮點。其值範圍是 超出了本討論的範圍, ,但在Java語言規範的部分4.2.3 中指定。 對於十進制值,此數據類型通常是默認選項 。由於上面提到的 ,此數據類型應該不會用於精確的值,如 作爲貨幣。

對於值的範圍,請參閱JLS的部分4.2.3 Floating-Point Types, Formats, and Values

+1

你沒有在JLS中找到你的答案嗎? – 2009-10-30 15:48:56

8

二進制浮點數具有令人感興趣的精度特性,因爲該值存儲爲二進制整數,該二進制整數升至二進制功率。當處理子整數值(即0到1之間的值)時,兩個「四捨五入」的負冪與十負負冪非常不同。

例如,數字0.1可以表示爲1 x 10 -1,但是沒有可以精確表示0.1的基數2指數和尾數的組合 - 最接近的是0.10000000000000001。

所以,如果你有一個應用程序,你正在使用像0.1或0.01這樣的值是一個很大的問題,但是小的(小於0.000000000000001%)錯誤是不能容忍的,那麼二進制浮點數不適合你。相反,如果十次冪對您的應用程序不是「特殊的」(十次冪在貨幣計算中很重要,但不是在物理學的大多數應用中),那麼實際上使用二進制浮點運算點,因爲它通常至少快一個數量級,而且它的內存效率要高得多。

來自Python文檔floating point issues and limitations的文章在以易於理解的形式解釋此問題方面表現出色。維基百科也有一篇關於floating point的好文章,它解釋了表示背後的數學。

+0

鏈接非常有用謝謝 – DeltaCap 2015-08-09 02:45:22

18

Java的基本數據類型

布爾: 1位。可能只有真值和假值。

字節: 1個帶符號的字節(二進制補碼)。覆蓋從-128到127

短值: 2個字節,符號(2的補碼),-32,768至32,767

INT: 4個字節,符號(2的補碼)。 -2,147,483,648至2,147,483,647。

long: 8字節有符號(二進制補碼)。範圍從-9,223,372,036,854,775,808到+9,223,372,036,854,775,807。

float: 4字節,IEEE 754.涵蓋從1.40129846432481707e-45到3.40282346638528860e + 38(正數或負數)的範圍。

double: 8字節IEEE 754.覆蓋範圍從4.94065645841246544e-324d到1.79769313486231570e + 308d(正值或負值)。

字符: 2個字節,無符號,Unicode的,0到65,535