CodeGym /Java Blog /Toto sisi /Java 浮點關鍵字
John Squirrels
等級 41
San Francisco

Java 浮點關鍵字

在 Toto sisi 群組發布
在計算技術發展的某個階段,很明顯中央處理單元需要硬體設備來處理浮點數。如今,所有電腦架構都可以有效地處理這些數字。當然,在程式語言中,也離不開對應的資料型別。Java中有兩種浮點數資料型態:float和double。Java Float關鍵字定義了一個在記憶體中佔用 32 位元的實數。我們將在本文中討論這些數字。

浮點數字。實數在計算機中是如何儲存的?

為了在電腦記憶體中儲存實數,需要分配一定數量的位元。實數儲存為符號(加號或減號)、螳螂和指數。什麼是尾數和指數最好用一個例子來解釋。月球的質量大約是 7*1022。這裡 7 是螳螂,22 是指數。當螢幕上顯示較大的數字或反之亦然的非常小的數字時,您可以看到類似 7E22 的條目。這是浮點數,這裡的 7 是螳螂,22 是 10 的指數或冪。這種表示法稱為指數表示法。

Java float 關鍵字與 Java Double 關鍵字

Java 中的浮點值(浮點數或實數)以floatdouble型別表示。正是這些關鍵字用於儲存小數點後直到某個符號的值。 double是具有雙精確度的數字,盡可能接近作為計算結果給出或獲得的值。Java Double用於任何數學計算(平方根、正弦、餘弦等),以及所有需要一定精確度的計算。 float資料類型用於不太精確的浮點類型。為了節省內存,很少使用它。下面我們有一個表格,其中包含有關 float 和 double 的主要信息,以及它們的區別。
漂浮 雙倍的
主要的 float 是一個單精度值 它是一個雙精度值
預設尺寸 4 位元組(32 位元) 8 位元組(64 位元)
預設值 0.0f 0.0
範圍 從 1.4e–045 到 3.4e+038 從 4.9e–324 到 1.8e+308
它是用來做什麼的 為了節省內存 相對準確地處理小數
所以Float關鍵字的意思是一個數字,一個在記憶體中佔用32位元或4個位元組的單精確度值。在某些處理器上,處理此類數字的速度更快,如前所述,與雙精度數字相比,它們佔用的空間更少。但是,光靠速度是不可能說得清楚的。假設一些現代處理器可以更快地處理雙精度數字。

Java 浮點數與雙重聲明

您可以使用與其他類型的數字相同的方式 聲明double類型的數字:
double myDouble = 2.7;
但是,如果您以這種方式表示浮點數,編譯器將要求您將數字類型變更為 double。這是浮點變數的錯誤範例:
public class FloatExample {
   public static void main(String[] args) {
//double and float variables
       double myDouble = 2.7;
       float myFloat = 3.14;
   }
}
如果運行該程序,會發生以下情況:
Error:(4, 25) java: incompatible types: possible lossy conversion from double to float
事實上,使用浮點數是不可取的,這樣做只是為了節省記憶體。Java中所有實小數預設都是Double ,語言的語法也強調這一點。如果您確實想使用浮點類型,則需要使用 f 終止數字來明確指定它。
public class FloatExample {
   public static void main(String[] args) {
//double and float variables
       double myDouble = 2.7;
       float myFloat = 3.14f;
   }
}
順便說一下,浮點數和雙精確度數可以寫成指數形式。
float myFloat2 = 2E22f;
double myDouble2 = 3e10;
如果您在「正常」表示中使用足夠大的數字,Java 將立即以指數形式顯示它們。讓我們舉個例子:
public class FloatExample {
   public static void main(String[] args) {
//float variables
               float myFloatNumber1=2182818284590.45f;
               float myFloatNumber2=19822612787260.141592181f;
               System.out.println("myFloatNumber1 = " + myFloatNumber1);
               System.out.println("myFloatNumber2 = " + myFloatNumber2);
       System.out.println("myFloatNumber1 + myFloatNumber2 = " + myFloatNumber1 + myFloatNumber2);
           }
       }
該程式的工作結果如下:
myFloatNumber1 = 2.1828183E12 myFloatNumber2 = 1.98226121E13 myFloatNumber1 + myFloatNumber2 = 2.1828183E121.98226121E13

特殊浮點數和雙精度數範例

Java語言中有3種特殊的浮點數,用來指示溢位和錯誤。他們來了:
  • 正無窮大是正數除以 0 的結果。由常數Double.POSITIVE_INFINITYFloat.POSITIVE_INFINITY表示。

  • 負無窮大是負數除以 0 的結果。由 Double.NEGATIVE_INFINITYFloat.NEGATIVE_INFINITY常數表示。

  • NaN(不是數字)表示0/0的計算或取負數的平方根。由常數Double.NaNFloat.NAN表示。

以下是使用這些特殊浮點數的範例:
public class FloatExample {
   public static void main(String[] args) {
       int myInt = 1;
       float zero = 0.0f;
       double negZero = -0.0;
       double negativeInfinity = Double.NEGATIVE_INFINITY;
       double positiveInfinity = Float.POSITIVE_INFINITY;

       System.out.println(myInt / zero);
       System.out.println(myInt / negZero);
       System.out.println(zero == negZero);
       System.out.println(negativeInfinity * 0);
       System.out.println(positiveInfinity+negativeInfinity);

   }
}
結果是:
Infinity -Infinity true NaN NaN

雙精度足夠嗎?

事實上,儘管Double類型具有雙精度,但使用浮點數(例如在金融計算中)並不是最好的主意,因為捨入誤差是不可接受的。因此,請嘗試在螢幕上顯示以下程式的輸出。
public class FloatExample {
   public static void main(String[] args) {
       System.out. println( "2.0 - 1.1 = " + (2.0 - 1.1));
   }
}
您將得到以下結果:
2.0 - 1.1 = 0.8999999999999999
假設結果為 0.9 是合乎邏輯的。然而,此類錯誤非常常見,並且與數字的內部二進位表示形式相關。例如,我們無法將 ⅓ 的精確值表示為小數;當然,二進位系統也有類似的限制。如果任務需要消除舍入誤差,Java 可以使用BigDecimal類別來實現此目的。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION