Java開發筆記(二十九)大整數BigInteger

早期的編程語言爲了節約計算機的內存,給數字變量定義了各類存儲規格的數值類型,好比字節型byte只佔用一個字節大小,短整型short佔用兩個字節大小,整型int佔用四個字節大小,長整型long佔用八個字節大小。可是長整型也只能表達到負2的63次方~2的63次方-1,超出這個範圍的巨大整數,竟連long類型也放不下。況且如今無論手機仍是電腦的內存都是以GB計量,所以原先錙銖計較幾個字節的數值類型便不合時宜了。爲此Java又設計了一種大整數類型BigInteger,這個BigInteger可以表示任意大小的整數,而再也不侷限於多少位的數值範圍。
乍看起來,BigInteger彷彿與Integer似曾相識,僅僅在類型開頭添加了「Big」字樣。事實上它倆個的類型設計有頗多殊途同歸之處,兩者的不少基本方法就是如出一轍,例如初始化賦值的valueOf方法、比較相等的equals方法,以及轉換爲基本數字類型的幾個方法(包括byteValue、shortValue、intValue、longValue、floatValue、doubleValue等)。固然BigInteger要處理的但是超大整數,故而它的用法仍是與Integer有所區別的,接下來一一介紹BigInteger特別的地方。
首先是如何對一個大整數變量進行初始化,前面介紹Integer的時候,提到Java代碼有三種給包裝變量賦值的方式,分別是使用等號直接賦給具體數字、調用valueOf方法進行賦值、經過關鍵字new建立指定數字的包裝變量。然而到了大整數BigInteger這裏,三種方式只剩下valueOf方法可以對大整數變量初始化。
其次,包裝變量容許使用「+」、「-」、「*」、「/」、「%」等運算符進行四則運算,到了大整數變量這裏卻不能使用算術運算符,而要經過專門的計算方法才能開展運算。具體說來,大整數類型使用add方法取代了加法運算符「+」,使用subtract方法取代了減法運算符「-」,使用multiply方法取代了乘法運算符「*」,使用divide方法取代了除法運算符「/」,使用remainder方法取代了取餘數運算符「%」,使用negate方法取代了負號運算符「-」,這些新方法的調用代碼示例以下:html

		// 生成一個指定數值的大整數變量
		BigInteger nine = BigInteger.valueOf(9);
		BigInteger four = BigInteger.valueOf(4);
		// add方法用來替代加法運算符「+」
		BigInteger sum = nine.add(four);
		System.out.println("sum="+sum);
		// subtract方法用來替代減法運算符「-」
		BigInteger sub = nine.subtract(four);
		System.out.println("sub="+sub);
		// multiply方法用來替代乘法運算符「*」
		BigInteger mul = nine.multiply(four);
		System.out.println("mul="+mul);
		// divide方法用來替代除法運算符「/」
		BigInteger div = nine.divide(four);
		System.out.println("div="+div);
		// remainder方法用來替代取餘數運算符「%」
		BigInteger remainder = nine.remainder(four);
		System.out.println("remainder="+remainder);
		// negate方法用來替代負號運算符「-」
		BigInteger neg = nine.negate();
		System.out.println("neg="+neg);

 

再次,Java雖然提供了經常使用的數學函數庫Math,可是Math庫只能操做基本數字類型的變量,不能操做大數字類型的變量。於是BigInteger另外提供了abs方法和pow方法,分別用於求大數字變量的絕對值,以及求大數字變量的N次方。下面是大整數類型BigInteger調用這兩個方法的代碼例子:java

		// abs方法用來替代數學庫函數Math.abs
		BigInteger abs = nine.abs();
		System.out.println("abs="+abs);
		// pow方法用來替代數學庫函數Math.pow
		BigInteger pow = nine.pow(2);
		System.out.println("pow="+pow);

 

總結一下,包裝數字類型相比基本數字類型,表達的數值範圍並無擴大,僅僅是調用方式上有所區別,可謂是換湯不換藥。而大數字類型真正解決了數值範圍的表達限制,而且徹底取消了帶有明顯數學印記的算術運算符,這才造成了面向方法而非面向運算的編程風格。編程


更多Java技術文章參見《Java開發筆記(序)章節目錄編程語言

相關文章
相關標籤/搜索