java.lang.Math類是在整個(gè)Java之中提供的數(shù)學(xué)計(jì)算的功能類,利用這個(gè)程序功能類可以非常方便的執(zhí)行一些基礎(chǔ)的數(shù)學(xué)計(jì)算:對(duì)數(shù)、三角函數(shù)融求、開方...
這個(gè)類是在JDK1.0提供給用戶使用的哼转,且不提供構(gòu)造方法。
類構(gòu)造方法私有化的原因有兩點(diǎn):
- 控制當(dāng)前類中的實(shí)例化對(duì)象個(gè)數(shù)钧唐,所謂的單例設(shè)計(jì)模式、多例設(shè)計(jì)模式;
- 類中沒有提供普通的成員屬性匠襟,并且類中的成員都是static申明钝侠,方法也是采用static聲明。
在Math類的成員里面提供有兩個(gè)公共的成員常量:E酸舍、PI
除了給出的常量之外帅韧,Math類中的方法幾乎都是static定義的方法。
范例:使用Math實(shí)現(xiàn)數(shù)學(xué)公式的調(diào)用
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println("[絕對(duì)值]:" + Math.abs(-10.3));
System.out.println("[最大值]:" + Math.max(10,30));
System.out.println("[最小值]:" + Math.min(10,30));
System.out.println("[正弦值]:" + Math.sin(-3.56));
System.out.println("[對(duì)數(shù)值]:" + Math.log(20));
}
}
執(zhí)行結(jié)果:
[絕對(duì)值]:10.3
[最大值]:30
[最小值]:10
[正弦值]:0.4063057021444168
[對(duì)數(shù)值]:2.995732273553991
以上的操作是為數(shù)學(xué)中最為常見的計(jì)算公式啃勉。
但是對(duì)于Math類類說里面有一個(gè)比較頭疼的方法忽舟,這個(gè)方法就是進(jìn)行四舍五入的處理操作,此方法定義如下:
public static long round(double a)
但是這個(gè)round()方法的實(shí)現(xiàn)計(jì)算結(jié)果可能和傳統(tǒng)的認(rèn)知是有差別的(需要特別注意淮阐,面試中可能問到)
范例:觀察四舍五入
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println("[四舍五入]:" + Math.round(15.1));
System.out.println("[四舍五入]:" + Math.round(15.51));
System.out.println("[四舍五入]:" + Math.round(-15.1));
System.out.println("[四舍五入]:" + Math.round(-15.51));
}
}
輸出:
[四舍五入]:15
[四舍五入]:16
[四舍五入]:-15
[四舍五入]:-16
在使用Math類實(shí)現(xiàn)四舍五入處理的過程之中叮阅,如果要操作的數(shù)值為負(fù)數(shù),那么這個(gè)時(shí)候如果小數(shù)點(diǎn)的內(nèi)容超過了“0.5”枝嘶,則會(huì)自動(dòng)進(jìn)行進(jìn)位處理帘饶。
雖然在Math類中提供有四舍五入的出來方法,可是這個(gè)四舍五入的處理方法會(huì)將全部的小數(shù)位進(jìn)行整體的進(jìn)位處理群扶,這樣的處理模式一定是存在問題的及刻。
例如:有一家公司每年的收入都是以億為單位的,今年的收入達(dá)到了3.467212億竞阐,如果說使用的Math.round()方法實(shí)現(xiàn)了四舍五入缴饭,最終就表示只有3億的收入,那么請(qǐng)問其余的4000多萬那里去了骆莹?如果想要解決這樣的問題就需要開發(fā)者自己去定義一個(gè)新的四舍五入的處理方法颗搂。
范例:實(shí)現(xiàn)自定義四舍五入操作
/**
* 該類是自定義的數(shù)學(xué)工具類
*/
class MathUtil {
private MathUtil() {
} //不存在成員屬性,構(gòu)造方法私有化
/**
* 進(jìn)行準(zhǔn)確位數(shù)的四舍五入操作
*
* @param num 表示要進(jìn)行處理的數(shù)字
* @param scale 表示要保留的小數(shù)位數(shù)
* @return 處理后的結(jié)果
*/
public static double round(double num, double scale) {
return Math.round(num * Math.pow(10.0, scale)) / Math.pow(10, scale);
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println(MathUtil.round(15.254521,3));
}
}
執(zhí)行結(jié)果:
15.255
在本工具類里面最終還是依靠Math類實(shí)現(xiàn)了四舍五入的操作幕垦,在Math類中由于round()方法不保留小數(shù)丢氢,所以讓數(shù)據(jù)進(jìn)行一個(gè)整倍的擴(kuò)充傅联,隨后在計(jì)算完成之后再除以相應(yīng)的倍數(shù),就得到了正確的四舍五入結(jié)果疚察。
這種四舍五入的實(shí)現(xiàn)思想不僅僅是用于Java技術(shù)上蒸走,實(shí)際上各個(gè)語言都有同樣的操作實(shí)現(xiàn),理解思路最為重要貌嫡。