00 07Java高級之數字操作類

1 Math數學計算類

程序就是一個數學的處理過程,所以在Java語言本身也提供有數字處理的類庫支持。

Math類的主要功能是進行數學計算的操作類,提供有基礎的計算公式,這個類的構造方法被私有化了,但不是單例,該類中的所有方法都是static型的方法,即:這些方法都可以通過類名稱直接調用。
範例:Math類測試

package cn.victor.demo;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		System.out.println(Math.abs(-15));
		System.out.println(Math.round(-15.49));   //-15
		System.out.println(Math.round(-15.5));   //-15
		System.out.println(Math.round(-15.51));  //-16
		System.out.println(Math.round(15.4));   //15
		System.out.println(Math.round(15.5));   //16
		System.out.println(Math.round(15.51));  //16
	}
	
}

雖然在Math類裏面提供有四捨五入的處理方法,但是這個四捨五入在進行處理的時候是直接將小數點後的所有位進行進位處理了,這樣肯定不方便,那麼現在最方便的做法是可以實現指定位數的保留。
範例:自定義四捨五入

package cn.victor.demo;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		System.out.println(myRound(-19.555,2));
	}
	
	public static double myRound(double num, int scale) {
		return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale);
	}
	
}

Math類裏面提供的基本上都是基礎的數學公式,需要的時候需要自己重新整合。

2 Random隨機數生成類

java.util.Random類的主要功能是產生隨機數的,這個類主要是依靠內部提供的方法來完成:
(1)產生一個不大於邊界的隨機自然數:public int nextInt​(int bound)
範例:產生隨機數

import java.util.Random;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		for(int i = 0; i < 10; i++) {
			System.out.print(new Random().nextInt(8) + "  ");
		}
	}
	
}

範例:隨機生成彩票號

package cn.victor.demo;

import java.util.Random;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		int []tickets = new int[7];
		int foot = 0;
		while(foot < 7) {
			int num = new Random().nextInt(37);
			if(isRepeat(tickets, num)) {
				tickets[foot++] = num;
			}
		}
		for(int i = 0; i < tickets.length; i++) {
			System.out.print(tickets[i] + "  ");
		}
	}
	
	public static boolean isRepeat(int[] tickets, int num) {
		if(num <= 0) {
			return false;
		}
		for(int i = 0; i < tickets.length; i++) {
			if( num == tickets[i]) {
				return false;
			}
		}
		
		return true;
	}
	
}

以後隨機的操作都可以利用Random來處理。

3 大數字處理類

在進行數學計算的過程裏面還有一個大數字的操作類,可以實現海量數字的計算(能提供的也只是基礎計算):BigInteger和BigDecimal。

當數字很大的時候只能夠利用字符串描述數字操作,所以這一點可以觀察兩個大數字操作的構造方法:
(1)BigInteger類構造:public BigInteger​(String val)
(2)BigDecimal構造:public BigDecimal​(String val)

範例:使用BigInteger實現四則運算

package cn.victor.demo;

import java.math.BigInteger;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		BigInteger bigA = new BigInteger("43488532549352394395234");
		BigInteger bigB = new BigInteger("434852394395234");
		System.out.println(bigA.add(bigB));
		System.out.println(bigA.subtract(bigB));
		System.out.println(bigA.multiply(bigB));
		System.out.println(bigA.divide(bigB));
	}
	
}

需要注意的是,雖然提供有大數字操作類,但是整體的操作之中還是需要考慮到性能問題。
範例:考慮性能問題

package cn.victor.demo;

import java.math.BigInteger;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		BigInteger bigA = new BigInteger("43488532549352394395234");
		BigInteger bigB = new BigInteger("434852394395234");
		System.out.println(bigA.pow(Integer.MAX_VALUE));
	}
	
}

此時的計算過程是非常緩慢的,所以任何的電腦有實有極限的。既然再進行數學除法的時候有可能無法進行整除的處理,那麼就可以使用其他的除法計算來求出餘數:
(1)求餘:第一個數字爲商,第二數字爲餘數。
範例:

package cn.victor.demo;

import java.math.BigInteger;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		BigInteger bigA = new BigInteger("43488532549352394395234");
		BigInteger bigB = new BigInteger("434852394395234");
		BigInteger[] result = bigA.divideAndRemainder(bigB);
		System.out.println("商:" + result[0] + "餘數:" + result[1]);
	}
	
}

如果在開發之中真進行計算的時候,該計算沒有超過基本數據所包含的位數,強烈不建議使用大數字類,因爲這種計算性能是很差的。

BigDecimal操作性是和BigInteger非常類似,都提供基礎的數學支持:
範例:

package cn.victor.demo;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class JavaAPIDemo {
	public static void main(String[] args) throws Throwable {
		BigDecimal bigA = new BigDecimal("43488532549352394395234");
		BigDecimal bigB = new BigDecimal("4348523395234");
		System.out.println(bigA.add(bigB));
		System.out.println(bigA.subtract(bigB));
		System.out.println(bigA.multiply(bigB));
		System.out.println(bigA.divide(bigB, RoundingMode.HALF_UP));
	}
	
}


但是在使用BigDecimal的時候有一個數據進位的問題,在類裏面定義有如下的除法計算:
(1)除法計算:
範例:使用BigDecimal完成四捨五入

package cn.victor.demo;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class JavaAPIDemo {
	
	public static double myRound(double num, int scale) {
		return new BigDecimal(num).divide(new BigDecimal(1.0), scale, RoundingMode.HALF_UP).doubleValue();
	}
	
	public static void main(String[] args) throws Throwable {
		System.out.println(myRound(19.86233, 2));
	}
	
}

Math的處理由於使用的都是基本類型,所以性能一定要高於大數字處理類的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章