類型轉換 類型轉換是將一個值從一種類型更改為另一種類型的過程。例如, 可以將String類型的數據“457”轉換為數值型,也可以將任意類型的 數據轉換為String類型。 如果從低精度數據類型向高精度數據類型轉換,則永遠不會溢出, 並且總是成功的;而把高精度數據類型向低精度數據類型轉換時,則會 有信 ...
類型轉換
類型轉換是將一個值從一種類型更改為另一種類型的過程。例如, 可以將String
類型的數據“457”轉換為數值型,也可以將任意類型的 數據轉換為String類型。 如果從低精度數據類型向高精度數據類型轉換,則永遠不會溢出, 並且總是成功的;而把高精度數據類型向低精度數據類型轉換時,則會 有信息丟失,有可能失敗。 數據類型轉換有兩種方式,即隱式轉換與顯式轉換。
隱式類型轉換
從低級類型向高級類型的轉換,系統將自動執行,程式員無須進行任何操作。這種類型的轉換稱為隱式轉換。下列基本數據類型會涉及數 據轉換,不包括邏輯類型和字元類型。這些類型按精度從低到高排列的 順序為byte < short < int < long < float < double
。
int x = 5;
float y = x; // y = 5.0
隱式轉換也要遵循一定的規則,來解決在什麼情況下將哪種類型的 數據轉換成另一種類型的數據。表列出了各種數據類型隱式轉換的 一般規則。
編譯階段
在編譯階段,Java 編譯器會檢查 x
的類型,並且知道它是一個 int
類型的值。由於 float
類型可以表示比 int
類型更大的範圍,並且 float
類型具有更高的精度,所以編譯器允許這種類型的轉換而不需要顯式的類型轉換操作符。
運行階段
在運行時,當這段代碼被執行時,JVM 會將 int
類型的值轉換為 float
類型。具體來說,這涉及到將 int
類型的 32 位整數值轉換為 float
類型的 32 位單精度浮點數格式。
這個轉換實際上是通過將整數值編碼為一個特殊的浮點數來完成的,其中整數被視為一個十進位數,並且沒有小數部分。這意味著,對於任何整數值,只要它在 float
類型可表示的範圍內(即不超出 float
類型的最大值),這個轉換就是精確無誤的。
記憶體佈局
在記憶體中,x
是一個 32 位的整數,而 y
是一個同樣占據 32 位但按照 IEEE 754 標準存儲的浮點數。當 x
的值被覆制到 y
時,實際上發生了以下步驟:
- 讀取
x
的值。 - 將這個整數值解釋為一個浮點數,這意味著創建一個浮點數的內部表示形式,包括符號位、指數和尾數部分。
- 將轉換後的值存儲到
y
中。
由於 int
和 float
都是 32 位寬,因此這個轉換不會涉及額外的數據擴展或壓縮。但是需要註意的是,儘管 5
作為一個整數可以直接轉換為 5.0f
並且不會丟失任何信息,但對於某些其他的 int
值,轉換到 float
可能會導致精度上的損失。
byte mybyte =127;//定義 byte 型變數 mybyte,並把允許的最大值賦給 mybyte
int myint = 150; //定義int型變數 myint,並賦值 150
float myfloat = 452.12f;//定義 float 型變數 myfloat,並賦值
char mychar = 10;//定義 char型變數 mychar,並賦值
double mydouble =45.46546;//定義 double 型變數,並賦值
//將運算結果輸出
System.out.println("byte 型與 float 型數據進行運算結果為:"+(mybyte+ myfloat));
System.out.println("byte 型與int型數據進行運算結果為:"+mybyte*myint);
System.out.println("byte 型與 char 型數據進行運算結果為:"+mybyte/mychar);
System.out.println("double 型與 char 型數據進行運算結果為:"+(mydouble +mychar));
mybyte
是一個byte
類型的值,而myfloat
是一個float
類型的值。由於float
類型的範圍和精度都大於byte
類型,因此byte
類型的值會被提升為float
類型,然後進行加法運算。最終的結果是一個float
類型的值。
mybyte
是一個byte
類型的值,而myint
是一個int
類型的值。byte
類型的值會被提升為int
類型,然後與int
類型的值進行乘法運算。最終的結果是一個int
類型的值。
mybyte
是一個byte
類型的值,而mychar
是一個char
類型的值。char
類型本質上是一個int
類型的值(16 位),因此byte
類型的值會被提升為int
類型,然後進行除法運算。最終的結果是一個int
類型的值。
mydouble
是一個double
類型的值,而mychar
是一個char
類型的值。char
類型的值會被提升為int
類型,然後int
類型的值會被進一步提升為double
類型,因為double
類型的範圍和精度都大於int
類型。最後,兩個double
類型的值進行加法運算,得到的結果也是一個double
類型的值。
顯示類型轉換
當把高精度的變數的值賦給低精度的變數時,必須使用顯式類型轉 換運算(又稱強制類型轉換)。
執行顯式類型轉換時,可能會導致精度損失。除boolean類型外, 其他基本類型都能以顯式類型轉換的方法實現轉換。
當把整數賦值給一個byte、short、int、long
型變數時,不可以 超出這些變數的取值範圍,否則必須進行強制類型轉換。例如: byte b = (byte)129
int num = 10;
System.out.println("整數值為: " + num);
//將int轉換為字元串類型
String data = String.valueOf(num);
System.out.println("字元串值為: " + data);
在這裡,我們使用了Java String類的valueOf()
方法將int類型變數轉換為字元串。
int a =(int)45.23; //45
long y=(long)456.6F; //456
int b = (int)'d'; //100
在浮點數向整數型轉換的過程中,小數部分被丟棄了,因為 int
類型只能存儲整數部分。這個過程是不可逆的,數據丟失是強制轉換的常見問題。表達式強制轉換,記得給表達式也加上括弧,否側電腦就會認為先強制轉換d,再和a相加。
double d = 9.99;
double a = 7.99;
int i = (int)(d + a); // 強制將表達式轉換為 int
System.out.println(i); // 輸出17
System.out.println((int)d+a); // 輸出 16.99
四捨五入可以使用Math.round()
方法。
本文來自博客園,作者:ivanlee717,轉載請註明原文鏈接:https://www.cnblogs.com/ivanlee717/p/18426617