- 實戰Java程序設計
- 北京尚學堂科技有限公司
- 846字
- 2019-10-16 10:45:17
2.6.2 浮點型
帶小數的數據在Java中稱為浮點型。浮點型可分為float類型和double類型,如表2-5所示。
表2-5 浮點型數據類型

float類型又稱作單精度類型,尾數可以精確到7位有效數字,但在很多情況下,float類型的精度很難滿足需求。double表示這種類型的數值精度約是float類型的兩倍,因此又被稱作雙精度類型,為絕大部分應用程序所采用。
Java浮點類型常量有兩種表示形式:
■ 十進制數形式,如3.14、314.0、0.314。
■ 科學記數法形式,如314e2、314E2、314E-2。
【示例2-11】使用科學記數法給浮點型變量賦值
double f=314e2; //314*10^2-->31400.0 double f2=314e-2; //314*10^(-2)-->3.14
float類型的數值有一個后綴F或者f,沒有后綴F/f的浮點數值默認為double類型。也可以在浮點數值后添加后綴D或者d,以明確其為double類型。
【示例2-12】float類型常量的寫法及變量的聲明
float f=3.14F; //float類型賦值時需要添加后綴F/f double d1= 3.14; double d2=3.14D;
老鳥建議
浮點類型float、double的數據不適合用于不容許舍入誤差的金融計算領域。如果需要進行不產生舍入誤差的精確數字計算,需要使用BigDecimal類。
【示例2-13】浮點型數據的比較一
float f=0.1f; double d=1.0/10; System.out.println(f==d); //結果為false
【示例2-14】浮點型數據的比較二
float d1=423432423f; float d2=d1+1; if(d1==d2){ System.out.println("d1==d2"); //輸出結果為d1==d2 }else{ System.out.println("d1! =d2"); }
運行以上兩個示例,發現示例2-13的結果是false,而示例2-14的輸出結果是d1==d2。這是因為由于字長有限,浮點數能夠精確表示的數是有限的,因而也是離散的。浮點數一般都存在舍入誤差,很多數字無法精確表示(例如0.1),其結果只能是接近,但不等于。二進制浮點數不能精確表示0.1、0.01、0.001這樣10的負次冪。并不是所有的小數都可以精確地用二進制浮點數表示。
java.math包下面兩個有用的類:BigInteger和BigDecimal,這兩個類可以處理任意長度的數值。BigInteger實現了任意精度的整數運算,BigDecimal實現了任意精度的浮點運算。
菜鳥雷區
不要使用浮點數進行比較!很多新手甚至很多理論不扎實的有工作經驗的程序員也會犯這個錯誤。需要比較數據時請使用BigDecimal類。
【示例2-15】使用BigDecimal進行浮點型數據的比較
import java.math.BigDecimal; public class Main { public static void main(String[ ] args) { BigDecimal bd=BigDecimal.valueOf(1.0); bd=bd.subtract(BigDecimal.valueOf(0.1)); bd=bd.subtract(BigDecimal.valueOf(0.1)); bd=bd.subtract(BigDecimal.valueOf(0.1)); bd=bd.subtract(BigDecimal.valueOf(0.1)); bd=bd.subtract(BigDecimal.valueOf(0.1)); System.out.println(bd); //0.5 System.out.println(1.0-0.1-0.1-0.1-0.1-0.1); //0.5000000000000001 } }
浮點數使用總結如下:
■ 默認是double類型。
■ 浮點數存在舍入誤差,數字不能精確表示。如果需要進行不產生舍入誤差的精確數字計算,需要使用BigDecimal類。
■ 避免在比較中使用浮點數,需要比較請使用BigDecimal類。
- 大學計算機基礎(第二版)
- C++案例趣學
- Learning Selenium Testing Tools with Python
- Swift 3 New Features
- 精通Scrapy網絡爬蟲
- Data Analysis with Stata
- 區塊鏈底層設計Java實戰
- Natural Language Processing with Java and LingPipe Cookbook
- 用案例學Java Web整合開發
- 編程可以很簡單
- Hadoop 2.X HDFS源碼剖析
- 從零開始學Selenium自動化測試:基于Python:視頻教學版
- Python無監督學習
- 小學生C++趣味編程從入門到精通
- MySQL從入門到精通