1. 程式人生 > >Java開發筆記(六)特殊數字的表達

Java開發筆記(六)特殊數字的表達

world 表達 int 數據 decimal stat java語言 細節 進制數

之前的文章提到,Java語言不但支持大眾熟知的十進制數,也支持計算機特有的二進制數、八進制數和十六進制數。可是在給數值變量賦值的時候,等號右邊的數字明顯屬於十進制,那究竟要如何書寫其它進制的數字呢?為此Java規定了幾種數字前綴,以這些前綴開頭的數字就表示特定進制的數值,二進制、八進制和十六進制及其對應的前綴說明如下:
1、二進制,該進制的數值以0b或者0B開頭,其後的數字只能是0和1。註意b是binary(二進制)的首字母。
2、八進制,該進制的數值以0開頭,其後的數字只能是0到7。
3、十六進制,該進制的數值以0x或者0X開頭,其後的數字除了0到9之外,還包括字母a到f(不區分大小寫)。註意x代表hexadecimal(十六進制)。
下面是聲明各種進制變量的代碼例子,依次演示了二進制數、八進制數、十六進制數和十進制數的賦值操作:

public class Prefix {
	
	public static void main(String[] args) {
		int binary = 0b11; // 二進制數,0b也可以寫成0B
		System.out.println("binary="+binary);
		int octonary = 011; // 以0開頭,後面非bB非xX的就是八進制數
		System.out.println("octonary="+octonary);
		int hexadecimal = 0x11; // 十六進制數,0x也可以寫成0X
		System.out.println("hexadecimal="+hexadecimal);
		int hexLetter = 0xff; // 十六進制數不區分大小寫,如ff也可以寫成FF
		System.out.println("hexadecimal="+hexLetter);
		int decimal = 11; // 沒有任何前綴,則默認為十進制數
		System.out.println("decimal="+decimal);
	}
}

運行上述代碼,在Console窗口的觀察結果如下圖所示。可見二進制的0b11轉成十進制數為3,八進制的011轉成十進數為8,十六進制的0x11轉成十進數為17,十六進制的0xff轉成十進數為255。

技術分享圖片

由於int類型最大只能表示21億4千多萬的整數,因此再大的整數就要使用long長整型變量了。例如截止2018年元旦,世界總人口達到74億4444萬3881,使用long變量保存世界人口的話,賦值代碼本應如下所示:

		long worldPopulation = 7444443881; // 這樣寫會報錯,因為整數默認是int類型

誰料Eclipse居然報錯,提示“The literal 7444443881 of type int is out of ”,意思是該數字超出了int類型的表示範圍。原來Java裏面的整數默認是整型,只分配四個字節的臨時空間,然而7444443881超出了整型數的範圍,致使默認的存儲空間不夠用了。要想擴大臨時的存儲空間,得在數字後面補上l或者L,表示該整數要求分配八個字節的長整型臨時空間,這樣才供得起7444443881這個大神。於是修改後的長整型賦值代碼如下所示:

		// 截至2018年元旦,世界人口大約有74億
		long worldPopulation = 7444443881L; // 長整型數要在數值末尾加上l或者L
		System.out.println("worldPopulation="+worldPopulation);

註意上面代碼末尾的L只表示數據類型,變量值並不包括“L”這個字母,運行測試代碼可見日誌打印結果為“worldPopulation=7444443881”。
剛提到Java的整數默認是整型,相對應的,Java的小數默認是雙精度型,那麽試試下面的代碼能否將小數賦值給float變量?

		float huilv = 3.14; // 這樣寫會報錯,因為小數默認是double類型

果然Eclipse也提示出錯了,正確的寫法要在小數末尾補上f或者F,表示該小數按照浮點數型分配存儲空間。改寫後的浮點數賦值代碼如下所示:

		// 3.14是中國古代數學家劉徽求得的圓周率數值,又稱徽率
		float huilv = 3.14F; // 浮點數要在數值末尾加上f或者F
		System.out.println("huilv="+huilv);

其實小數後面也可以補上d或者D,表示該小數按照雙精度型分配存儲空間,只是因為Java的小數默認就是double類型,所以小數後面的D可加可不加,不影響正常的編譯。

這下幾種數字類型都能夠正確地賦值了,但是還有個細節問題,當數字的位數很多的時候,後面有多少個零會讓初學者看得眼花繚亂。現實生活中,整數通常每隔四位就在中間補上空格或者補上逗號,譬如說中國的領土面積是960萬平方公裏,實際書寫一般為“960 0000”或者“960,0000”,這樣可以很清楚地區分萬的單位乃至億的單位。在Java編程中,從Java7開始,允許在數字中間插入下劃線作為分隔符,下劃線本身沒有保存到變量中,它的作用類似前面的空格和逗號,僅僅是方便程序員數清具體的位數罷了。下面是在數字變量賦值時添加下劃線的代碼例子:

		// 中國的領土面積是960萬平方千米
		int chinaArea = 960_0000; // 從Java7開始,數字中間允許添加下劃線,從而可以更方便地區分位數
		System.out.println("chinaArea="+chinaArea);

雖然下劃線方便了程序員數數,數字的長度卻變得更長了,倘若再來一個更大的整數,例如太陽到地球的距離為1.5億公裏,展開可是150000000千米,Java賦值加了下劃線則為“1_5000_0000”,此時後面拖了許多個零。在數學上,可以通過科學記數法表示這種較大的數,也就是把一個數書寫成a與10的n次冪相乘的形式。Java代碼也有與科學記數法類似的表達方式,像1.5億這個數字,其實等於1.5乘以10的8次方,在代碼中可以通過“E8”或者“e8”表示10的8次方,於是采取科學記數法的Java賦值代碼舉例如下:

		// 太陽距離地球1.5億千米
		double sunDistance = 1.5E8; // E8表示乘以10的8次方,E是exponent(指數)的首字母
		System.out.println("sunDistance="+sunDistance);

註意上述代碼中的1.5是小數,所以必須使用雙精度數作為賦值變量,而不能用整形或長整型數。即使E前面的數字是整數,該變量也只能是雙精度類型,因為Java約定了科學記數法專用於雙精度數字。

Java開發筆記(六)特殊數字的表達