1. 程式人生 > >Java之路:基本資料型別的轉換

Java之路:基本資料型別的轉換

基本資料型別的轉換

1、自動型別轉換

也稱隱式轉換,擴充套件轉換,將範圍小的資料型別賦值給範圍大的資料型別,編譯器會自動進行轉換

例如:

byte b = 20;
int a = b;	// 將byte型別賦值給int型別,編譯器會自動將byte型別轉化為Int型別

自動轉換條件

(1)轉換前後的資料型別要相互相容。
(2)轉換後的資料型別的表示範圍大於轉換前的型別。即擴大轉換。

注意
(1)Java中,由於boolean型別只能存放true或false,與數字及字元不相容,因此,boolean型別不能與其他任何資料型別進行轉換。
(2)Java在進行數值運算時,以儘量不損失精度(正確性)為準則。

例如:一個字元型變數(本質上是2Byte大小的整數)與一個整型變數(預設4Byte大小的整數)進行運算,在運算前,不同型別的運算元需要先轉化成同一資料型別,然後再運算。因此,要先將字元型的變數轉換為整型變數,否則將4位元組整型變數轉換為2位元組的字元型,很有可能導致整型變數的值會溢位,從而導致計算錯誤。字元與整數是可使用自動型別轉換的。

假設參與某種運算有兩個不同的運算元(運算元1和運算元2),二者具有不同的資料型別,在運算操作之前,它們需要轉換為同一資料型別,其相互轉換的規則如下表所示。
在這裡插入圖片描述

下面看個例子:當兩個數中有一個為浮點數時,其運算的結果會有什麼樣的變化。

public
class Demo { public static void main(String[] args) { int a = 152; float b = 24.1f; System.out.println("a = " + a + "\n" + "b = " + b); System.out.println("a/b = " + a/b); } }

【結果】
在這裡插入圖片描述
【結果分析】
從執行的結果可以看出,當兩個數中有一個為浮點數時,其運算的結果會直接轉換為浮點數。

當表示式中變數的型別不同時,Java會自動把較小的表示範圍轉換成較大的表示範圍後,再做運算。

也就是說,假設有一個整數和雙精度浮點數作運算,Java會把整數轉換成雙精度浮點數後再做運算,運算結果也會變成雙精度浮點數。

2、強制型別轉換

也稱顯式轉換,窄化轉換,將範圍大的資料型別賦值給範圍小的資料型別,也即將能容納更多資訊的資料型別轉換成無法容納那麼多資訊的型別,有可能面臨資訊丟失的危險。

double d = 200.12312;
int a = (int)d;	// 將double型別賦值給int型別,必須進行顯式轉換

【語法】
(欲轉換的資料型別)變數名;

int i = (double)20.1;

【例】

public class DefaultDemo {
 public static void main(String[] args) {
	 int a = 152, b = 9;
	 float f1, f2, f3, f4;
	 System.out.println("a = " + a + "\n" + "b = " + b);
	 f1 = a/b;
	 f2 = (float)a/b;	// 將整數a強制轉換為浮點數,再與b相除
	 f3 = a/(float)b;	// 將整數b強制轉換為浮點數,再以a除之
	 f4 = (float)a/(float)b;	// 將整數a,b同時強制轉換為浮點數,再相除
	 System.out.println("f1 = a/b = " + f1);
	 System.out.println("f2 = (float)a/b = " + f2);
	 System.out.println("f3 = a/(float)b = " + f3);
	 System.out.println("f4 = (float)a/(float)b = " + f4)}
}

【結果】
在這裡插入圖片描述

注意:當兩個整數相除時,小數點後的數字會被截斷(並不四捨五入),使得運算結果為整數。要想得到浮點數,必須將其中一個或兩個數轉換為浮點數。

由於在轉換的過程中可能會丟失資料的精確度,因此Java並不會“自動”做這些型別的轉換,此時就必須要做強制性的轉換,例如 int x = (int)10.35(結果x=10),將double型別的值(10.35)強制轉換為int型別(10),這樣也丟失了很多的資訊。