Java開發筆記(七)強制類型轉換的風險

編碼過程當中,不但能將數字賦值給某個變量,還能將一個變量賦值給另外一個變量。好比下面代碼把整型變量changjiang賦值給整型變量longRiver:java

		// 長江的長度爲6397公里
		int changjiang = 6397;
		System.out.println("changjiang="+changjiang);
		int longRiver = changjiang; // 把一個整型變量賦值給另外一個整型變量
		System.out.println("longRiver="+longRiver);

 

運行上面的測試代碼,發現兩個整型變量的數值如出一轍。測試

同類型的變量之間互相賦值徹底沒有問題,麻煩的是給不一樣類型的變量賦值。要是把整型變量賦值給長整型變量,則發現編譯器直接提示錯誤,此時須要在原變量前面添加「(新類型)」表示強制轉換類型。改寫後的變量賦值語句就變成了下面這樣:編碼

		// 不一樣類型的變量相互賦值,須要在原變量前面添加「(新類型)」表示強制轉換類型
		long longRiver = (long) changjiang; // 把整型變量賦值給長整型變量

 

然而,不一樣類型的變量相互賦值是有風險的,尤爲是把高精度的數字賦值給低精度的數字,例如將八字節的長整型數強制轉成四字節的整型數,結果只有低位的四個字節保留了下來,而高位的四個字節被捨棄掉了。下面作個實驗,先用長整型變量保存世界人口的數量74億,再把該長整型變量賦值給整型變量,具體代碼以下所示:日誌

		// 截至2018年元旦,世界人口大約有74億
		long worldPopulation = 7444443881L;
		System.out.println("worldPopulation="+worldPopulation);
		// 把長整型數賦值給整型數會丟失前四個字節
		int shijierenkou = (int) worldPopulation; // 把長整型數強制轉成整型數
		System.out.println("shijierenkou="+shijierenkou);

 

運行以上的實驗代碼,打印出來的變量值見如下日誌:blog

worldPopulation=7444443881
shijierenkou=-1145490711

 

可見長整型數強制轉成整型數,結果整個數值都變掉了。編譯器

既然整數之間強制轉換類型存在問題,小數之間的類型強制轉換也不例外。假若把雙精度數強制轉換成浮點數,數字精度也會變差。接下來仍然經過實驗進行觀察,以常見的圓周率爲例,它的密率是中國古代數學家祖沖之發現的,其數值爲3.1415926,包括小數部分在內共有8位數字。因爲double類型的數字精度達到15到16位,所以利用雙精度變量保存圓周密率徹底沒有問題。可是若是將這個密率的雙精度變量賦值給浮點變量,又會發生什麼狀況?下面的代碼就演示了把雙精度數強制轉成浮點數的場景:數學

		// 3.1415926是中國古代數學家祖沖之求得的圓周率數值,又稱祖率
		double zulv = 3.1415926;
		System.out.println("zulv="+zulv);
		// 把雙精度數賦值給浮點數會丟失數值精度
		float pai = (float) zulv; // 把雙精度數強制轉成浮點數
		System.out.println("pai="+pai);

 

運行上述實驗代碼,日誌打印的變量值見下:io

zulv=3.1415926
pai=3.1415925

 

可見浮點變量保存的密率數值變成了3.1415925,與雙精度變量相比,末尾的6變爲5。之因此密率數值發生變化,是由於float類型的數字精度只有6到7位,而前述密率的總位數達到8位,顯然超出了float類型的精度範圍,使得強轉以後的浮點變量損失了範圍外的精度。編譯

除了整數之間互轉、小數之間互轉之外,還有整數轉小數和小數轉整數的狀況,但是整數與小數互轉依然存在數值虧損的問題。譬如一個雙精度變量賦值給一個整型變量,因爲整型變量沒有空間保存小數部分,所以本來雙精度變量在小數點後面的數字全被捨棄。如下代碼就示範了這種數字類型轉換的例子:class

		double jiage = 9.9;
		System.out.println("jiage="+jiage);
		// 把小數賦值給整型變量,會直接去掉小數點後面部分,不會四捨五入
		int price = (int) jiage; // 把雙精度數強制轉成整型數
		System.out.println("price="+price);

 

運行以上的測試代碼,日誌打印結果以下:

jiage=9.9
price=9

 

果真整型變量丟掉了雙精度變量的小數部分,因而可知,不一樣類型之間的變量互轉問題多多,若非必要,通常不進行兩個變量的類型強制轉換操做。

相關文章
相關標籤/搜索