官术网_书友最值得收藏!

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類。

主站蜘蛛池模板: 花莲市| 台前县| 石台县| 万州区| 柞水县| 广州市| 辽中县| 沾益县| 濉溪县| 镇安县| 资兴市| 隆尧县| 磴口县| 宣城市| 广东省| 偃师市| 武强县| 广昌县| 和平县| 同仁县| 石台县| 光山县| 茌平县| 青神县| 秦安县| 乳源| 扎赉特旗| 云浮市| 津市市| 鄄城县| 阜康市| 汉源县| 奉节县| 台南市| 中超| 贡山| 古交市| 城固县| 东至县| 潞城市| 营山县|