【JavaSE筆記】Java常用類及其方法(十)_Math

本期知識點:
Math

類 Math(java.lang)

public final class Math extends Object

Math 類包含用於執行基本數學運算的方法,如初等指數、對數、平方根和三角函數。

與 StrictMath 類的某些數學方法不同,並非 Math 類所有等價函數的實現都定義爲返回逐位相同的結果。此類在不需要嚴格重複的地方可以得到更好的執行。

默認情況下,很多 Math 方法僅調用 StrictMath 中的等價方法來完成它們的實現。建議代碼生成器使用特定於平臺的本機庫或者微處理器指令(可用時)來提供 Math 方法更高性能的實現。這種更高性能的實現仍然必須遵守 Math 的規範。

實現規範的質量涉及到兩種屬性,即返回結果的準確性和方法的單調性。浮點 Math 方法的準確性根據 ulp(units in the last place,最後一位的進退位)來衡量。對於給定的浮點格式,特定實數值的 ulp 是包括該數值的兩個浮點值的差。當作爲一個整體而不是針對具體參數討論方法的準確性時,引入的 ulp 數用於任何參數最差情況下的誤差。如果一個方法的誤差總是小於 0.5 ulp,那麼該方法始終返回最接近準確結果的浮點數;這種方法就是正確舍入。一個正確舍入的方法通常能得到最佳的浮點近似值;然而,對於許多浮點方法,進行正確舍入有些不切實際。相反,對於 Math 類,某些方法允許誤差在 1 或 2 ulp 的範圍內。非正式地,對於 1 ulp 的誤差範圍,當準確結果是可表示的數值時,應該按照計算結果返回準確結果;否則,返回包括準確結果的兩個浮點值中的一個。對於值很大的準確結果,括號的一端可以是無窮大。除了個別參數的準確性之外,維護不同參數的方法之間的正確關係也很重要。因此,大多數誤差大於 0.5 ulp 的方法都要求是半單調的:只要數學函數是非遞減的,浮點近似值就是非遞減的;同樣,只要數學函數是非遞增的,浮點近似值就是非遞增的。並非所有準確性爲 1 ulp 的近似值都能自動滿足單調性要求。

Math類的字段

public static final double E       比任何其他值都更接近 e(即自然對數的底數)的 double 值。
public static final double PI    比任何其他值都更接近 pi(即圓的周長與直徑之比)的 double 值。

Math類的成員方法:

public static int abs(int a)   絕對值
public static double ceil(double a)   向上取整
public static double floor(double a)   向下取整
public static double pow(double a, double b)   a的b次冪
public static int max(int a,int b)   求最大值
public static double random()   獲取一個隨機數:[0.0,1.0)
public static long round(double a)   四捨五入
public static double sqrt(double a)   正平方根

public class MathDemo01 {
	public static void main(String[] args) {
		//public static final double PI
				System.out.println("PI:"+Math.PI);
				
		//		public static final double E
				System.out.println("E:"+Math.E);
				
		//		public static int abs(int a):絕對值
				System.out.println("abs:"+Math.abs(100));
				System.out.println("abs:"+Math.abs(-100));
				
				//public static double ceil(double a):向上取整
				System.out.println("ceil:"+Math.ceil(12.34));
				System.out.println("ceil:"+Math.ceil(12.56));
				
				//public static double floor(double a):向下取整
				System.out.println("floor:"+Math.floor(12.34));
				System.out.println("floor:"+Math.floor(12.56));
				
				//public static double pow(double a, double b):a的b次冪
				System.out.println("pow:"+Math.pow(2.0, 3.0));
				
				//	public static int max(int a,int b):求最大值
				System.out.println("max:"+Math.max(25, 20));
				System.out.println("max:"+Math.max(Math.max(50,24), 20));//方法嵌套:不屬於遞歸 (方法調用方法本身的一種現象)
				
				//public static double random():獲取一個隨機數:[0.0,1.0)
				System.out.println("random:"+Math.random());
				//求:1-100之間的隨機數
				System.out.println("random:"+(int)(Math.random()*100+1));
				
				
				//public static long round(double a):四捨五入
				System.out.println("round:"+Math.round(12.34f));//返回整數
				System.out.println("round:"+Math.round(12.56F));//小數過0.5進行四捨五入,返回整數
				
				//public static double sqrt(double a):正平方根
				System.out.println("sqrt:"+Math.sqrt(4));
	}
}


Math類的練習

import java.util.Scanner;

/*
 * 需求:請設計一個方法,可以實現獲取任意範圍內的隨機數。
 * 
 * 	分析:
 * 		1)鍵盤可以錄入兩個數據
 * 			int start
 * 			int end
 * 		2)想辦法獲取這兩個數據之間的隨機數
 * 			寫一個功能實現,最終返回的是一個int類型
 * 		3)輸出結果
 * */
public class MathDemo02 {
	public static void main(String[] args) {
		//創建鍵盤錄入對象
		Scanner x = new Scanner(System.in);
		//錄入數據
		System.out.println("請輸入開始的數:");
		int start = x.nextInt();
		System.out.println("請輸入結束的數:");
		int end = x.nextInt();
		for(int i = 0 ; i < 20; i ++){
			int number = getRandom(start,end);
			System.out.println(number);
		}
	}
	private static int getRandom(int start, int end) {
		int number = (int)(Math.random()*(end-start+1)+start);
		return number;
	}
		
}


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