Java開發筆記(十一)常見的數學函式
前面介紹了Java程式設計的四則運算,雖然提供了基礎的加減乘除符號,但是數學上還有其它運算子號,包括四捨五入用到的約等號≈、求絕對值的“| |”、開平方的“√ ̄”,這些運算子形態各異,而且並非ASCII碼的基本字元,也就意味著它們無法原樣搬到Java來。
為此,Java的設計師封裝了一套數學函式庫Math,把加減乘除以外的常見數學運算都納入,然後作為Math庫的函式方法提供給程式設計師呼叫。比如四捨五入變成了Math庫的round方法,取絕對值變成了Math庫的abs方法,Math庫另外提供了取整方法floor和ceil。其中floor方法指的是將變數往下取整,也就是往數值小的方向取整;ceil方法指的是將變數往上取整,也就是往數值大的方向取整。
需要注意的是,如果變數值為負數(假設x=-9.9),那麼對x做floor取整將得到-10,對x做ceil取整將得到-9,這種情況與常人理解的正數取整並不相同。假設變數值為正數(如x=9.9),則對x做floor向下取整將得到9,對x做ceil向上取整將得到10。負數的取整結果看似有悖常理,其實完全沒有毛病,因為floor方法取的是數值更小的整數,而ceil方法取的是數值更大的整數。既然-10<-9.9<-9,於是floor取整得到了數值更小的-10,而ceil取整得到了數值更大的-9。若想眼見為實的話,則可執行下面的測試程式碼加以驗證:
double decimalPositive = 9.9; // 四捨五入 long roundPositive = Math.round(decimalPositive); System.out.println("roundPositive="+roundPositive); // 往下取整,也就是往數值小的方向取整 double floorPositive = Math.floor(decimalPositive); System.out.println("floorPositive="+floorPositive); // 往上取整,也就是往數值大的方向取整 double ceilPositive = Math.ceil(decimalPositive); System.out.println("ceilPositive="+ceilPositive); double decimalNegative = -9.9; // 四捨五入 long roundNegative = Math.round(decimalNegative); System.out.println("roundNegative="+roundNegative); // 往下取整,也就是往數值小的方向取整 double floorNegative = Math.floor(decimalNegative); System.out.println("floorNegative="+floorNegative); // 往上取整,也就是往數值大的方向取整 double ceilNegative = Math.ceil(decimalNegative); System.out.println("ceilNegative="+ceilNegative); // 取絕對值 double absoluteValue = Math.abs(decimalNegative); System.out.println("absoluteValue="+absoluteValue);
科學計算上常常還需要開平方、冪運算、求對數等複雜函式,Java自帶的Math庫也提供了相應的方法,例如sqrt方法對應開平方運算,pow方法對應求某數的n次方,exp方法對應求自然常數e的n次方,log方法對應求自然對數的運算(即exp方法的逆運算),log10方法對應求底數為10的對數。這些方法的詳細呼叫程式碼如下所示:
double nine = 9; // 開平方。對應數學符號√ ̄ double sqrt = Math.sqrt(nine); System.out.println("sqrt="+sqrt); // 求n次方。pow的第一個引數為冪運算的底數,第二個引數為冪運算的指數 double pow = Math.pow(nine, 2); System.out.println("pow="+pow); double five = 5; // 求自然常數e的n次方 double exp = Math.exp(five); System.out.println("exp="+exp); // 求自然對數,為exp方法的逆運算。對應數學函式lnN double log = Math.log(exp); System.out.println("log="+log); // 求底數為10的對數。對應數學函式logN double log10 = Math.log10(100); System.out.println("log10="+log10);
除了代數運算的常見函式之外,Math庫還提供了幾何方面的三角函式運算,包括正弦、餘弦、正切、反正弦、反餘弦、反正切都能找到對應的Math方法。不過Math庫的三角方法與幾何上的三角函式用法有所不同,幾何的三角函式如sin、cos,後面跟著角度的數值,而Math庫的三角方法跟著是弧度的數值。所謂弧度指的是該角度對應的圓弧長度比去圓的半徑,即:弧度=弧長/半徑=(角度/360)2πr/r=角度π/180。搞清楚了弧度與角度之間的關係,利用Math庫進行各種三角運算就簡單了,下面是這些三角方法的呼叫程式碼例子:
// 三角函式的角度
double angle = 60;
// 弧度=該角度對應的弧長/半徑
double radian = angle*Math.PI/180;
// 求某弧度的正弦。求反正弦要呼叫asin方法
double sin = Math.sin(radian);
System.out.println("sin="+sin);
// 求某弧度的餘弦。求反餘弦要呼叫acos方法
double cos = Math.cos(radian);
System.out.println("cos="+cos);
// 求某弧度的正切。求反正切要呼叫atan方法
double tan = Math.tan(radian);
System.out.println("tan="+tan);
// 求某弧度的餘切。Math庫未提供求餘切值的方法,其實餘切值就是正切值的倒數
double ctan = 1.0/tan;
System.out.println("ctan="+ctan);