一、浮點數
a):float類型又被稱作單精度類型,尾數可以精確到7位有效數字,在很多情況下,float類型的精度很難滿足需求。
b):double表示這種類型的數值精度是float類型的兩倍,又被稱作雙精度,絕大部分應用程序都采用double類型。
二、浮點數的表述范圍
類型 |
占用存儲空間 |
表數范圍 |
float |
4字節 |
-3.403E38~3.403E38 |
double |
8字節 |
-1.798E308~1.798E308 |
三、在java中表示浮點數的兩種表示形式
a):十進制形式 如:3.14 314.0 0.314
b):科學記數法形式 如: 314e-2 3.14e2 314E-3
四、測試浮點數代碼:
public class TestFloadAndDoubleType { public static void main(String[] args) { /* [X]因為浮點數默認是double類型、而float f=0.1中0.1默認是double類型的、 這樣的話將一個8個字節的double類型轉換為4個字節的float類型會出現編譯錯誤 為了明確其類型我們在后面加f */ //float a=0.1;//[X]錯誤的 float b=0.1f;//[√]加f來明確其類型、正確的 //浮點數可以用科學計數法來表示 double c=314e-2;//3.14 double d=314e-3;//0.314 System.out.println("double c=314e-2中c的執行結果為: c="+c); System.out.println("double d=314e-3中d的執行結果為: d="+d); //浮點數的比較(注意:浮點數運算結果比較存在誤差問題、所以不能精確比較) double e=1.0/10; //0.1 System.out.println("浮點數運算結果誤差示例:0.1f==1.0/10其比較結果為:"+(b==e)); float d1 = 423432423f; float d2 = d1+1; /** * 二進制表示浮點數誤差問題 */ System.out.println("d1="+d1); System.out.println("d2="+d2); System.out.println("423432423f==423432423f+1的比較結果為: "+(d1==d2));//天吶盡然誤差到相當? } }
測試結果為:
五、總結
a):浮點數的默認類型為double類型
b):浮點類型float, double的數據類型不適合在不允許有舍入誤差的金融計算領域
c):由於浮點數占用存儲空間有限,所以能夠精確表示的數是有限的,因而也是離散的。浮點數一般都存在舍入誤差,很多數字無法精確表示,其結果只能是接近,但不等於。
d):二進制浮點數不能精確的表示0.1,0.01,0.001這樣10的負次冪。並不是所有的小數都能可以精確的用二進制浮點數表示。
e):如果需要進行不產生舍入誤差的精確數字計算大小數使用BigDecimal類、大整數BigInteger
注意:通過以上我們對浮點類型的了解、我們應該避免編程中使用浮點類型進行的運算結果的比較