天天看點

Java核心技術卷I基礎知識3.3.2 浮點類型

<b>3.3.2 浮點類型</b>

浮點類型用于表示有小數部分的數值。在java中有兩種浮點類型,具體内容如表3-2所示。

表3-2 浮點類型

類型     存儲需求     取值範圍

f?loat    4位元組   大約±3.402 823 47e+38f(有效位數為6~7位)

double  8位元組   大約±1.797 693 134 862 315 70e+308(有效位數為15位)

double表示這種類型的數值精度是f?loat類型的兩倍(有人稱之為雙精度數值)。絕大部分應用程式都采用double類型。在很多情況下,f?loat類型的精度很難滿足需求。實際上,隻有很少的情況适合使用f?loat類型,例如,需要單精度資料的庫,或者需要存儲大量資料。

f?loat類型的數值有一個字尾f或f(例如,3.14f)。沒有字尾f的浮點數值(如3.14)預設為double類型。當然,也可以在浮點數值後面添加字尾d或d(例如,3.14d)。

      注釋:可以使用十六進制表示浮點數值。例如,0.125=2-3可以表示成0x1.0p-3。在十六進制表示法中,使用p表示指數,而不是e。注意,尾數采用十六進制,指數采用十進制。指數的基數是2,而不是10。

所有的浮點數值計算都遵循ieee 754規範。具體來說,下面是用于表示溢出和出錯情況的三個特殊的浮點數值:

正無窮大

負無窮大

nan(不是一個數字)

例如,一個正整數除以0的結果為正無窮大。計算0/0或者負數的平方根結果為nan。

      注釋:常量double.positive_infinity、double.negative_infinity和double.nan(以及相應的float類型的常量)分别表示這三個特殊的值,但在實際應用中很少遇到。特别要說明的是,不能這樣檢測一個特定值是否等于double.nan:

所有“非數值”的值都認為是不相同的。然而,可以使用double.isnan方法:

      警告:浮點數值不适用于無法接受舍入誤差的金融計算中。例如,指令system.out.println (2.0–1.1)将列印出0.8999999999999999,而不是人們想象的0.9。這種舍入誤差的主要原因是浮點數值采用二進制系統表示,而在二進制系統中無法精确地表示分數1/10。這就好像十進制無法精确地表示分數1/3一樣。如果在數值計算中不允許有任何舍入誤差,就應該使用bigdecimal類,本章稍後将介紹這個類。