導(dǎo)語
數(shù)學(xué)操作類的使用综慎,其中BigInteger、BigDecimal可以操作大數(shù)字勤庐。最下面是重點(diǎn)示惊,實(shí)現(xiàn)準(zhǔn)確的四舍五入操作好港。
主要內(nèi)容
- Math類
- Random類
- 大數(shù)字操作類
具體內(nèi)容
Math類
Math就是一個(gè)專門進(jìn)行數(shù)學(xué)計(jì)算的操作類,里面提供了一系列的數(shù)學(xué)計(jì)算方法米罚。
在Math類里面提供的一切方法都是static型的方法钧汹,因?yàn)镸ath類里面沒有普通屬性。
Math有一個(gè)方法要引起注意:
四舍五入:public static long round(double a)录择。
范例:觀察四舍五入
public class TestDemo {
public static void main(String args[]) {
System.out.println(Math.round(15.5));
System.out.println(Math.round(-15.5));
System.out.println(Math.round(-15.51));
}
}
輸出結(jié)果
16
-15
-16
如果進(jìn)行負(fù)數(shù)四舍五入的時(shí)候拔莱,操作的數(shù)據(jù)小數(shù)位大于0.5才進(jìn)位,小于等于0.5不進(jìn)位隘竭。
Random類
這個(gè)類的主要功能是取得隨機(jī)數(shù)的操作類塘秦。
范例:產(chǎn)生10個(gè)不大于100的正整數(shù)(0~99)
public class TestDemo {
public static void main(String args[]) {
Random rand = new Random();
for(int i = 0; i < 10; i++) {
System.out.print(rand.nextInt(100) + "、");
}
}
}
輸出結(jié)果可能為
53动看、31尊剔、77、51菱皆、68须误、23、59仇轻、63京痢、27、93篷店、
大整數(shù)操作類:BigInteger
如果說現(xiàn)在要操作的數(shù)據(jù)值很大祭椰,那么首先想到的應(yīng)該是double,那么如果說現(xiàn)在計(jì)算的結(jié)果超過了double會(huì)怎樣船庇。
public class TestDemo {
public static void main(String args[]) {
System.out.println(Doublic.MAX_VALUE * Doublic.MAX_VALUE);
}
}
輸出結(jié)果
Infinity
現(xiàn)在發(fā)現(xiàn)此時(shí)的計(jì)算結(jié)果并不存在吭产,因?yàn)橐呀?jīng)超過了double的范疇。
面試題:請(qǐng)問當(dāng)前假設(shè)有兩個(gè)很大的數(shù)字要進(jìn)行數(shù)學(xué)計(jì)算(超過了doulble范圍)鸭轮,你該怎么做臣淤?
如果真的超過了double的范圍,那么肯定無法使用double進(jìn)行保存窃爷,只有String型才能保存邑蒋。如果真的數(shù)據(jù)很大的數(shù)字要進(jìn)行數(shù)學(xué)計(jì)算,只能夠?qū)⑵渥優(yōu)镾tring型按厘,而后按位取出每一個(gè)字符保存的數(shù)據(jù)医吊,進(jìn)行手工的計(jì)算。
所以在Java里面考慮到了此類情況逮京,專門提供了大數(shù)字的操作類卿堂,其中就有BigInteger、BigDecimal兩種。
BigInteger類的構(gòu)造方法:public BigInteger(String val)草描,它接收的是String型览绿。
public class TestDemo {
public static void main(String args[]) {
BigInteger bigA = new BigInteger("124123412141234");
BigInteger bigB = new BigInteger("987654345");
System.out.println("加法操作:" + (bigA.add(bigB)));
System.out.println("減法操作:" + (bigA.subtract(bigB)));
System.out.println("乘法操作:" + (bigA.multiply(bigB)));
System.out.println("除法操作:" + (bigA.divide(bigB)));
// 數(shù)組里面只有兩個(gè)元素,第一個(gè)元素表示的是商穗慕,第二個(gè)元素表示的是余數(shù)
BigInteger result[] = bigA.divideAndRemainder(bigB);
System.out.println("商:" + result[0] + " 余數(shù):" + result[1]);
}
}
輸出結(jié)果
加法操作:124124399795579
減法操作:124122424486889
乘法操作:122591027317515513761730
除法操作:125674
商:125674 余數(shù):939987704
在Java里面雖然提供了大數(shù)字的操作類饿敲,但是很多的時(shí)候,我們使用的項(xiàng)目開發(fā)可能對(duì)于數(shù)字要求會(huì)更加的敏感逛绵,這個(gè)時(shí)候Java本身所提供的數(shù)字類是幫助不大的怀各。
這個(gè)時(shí)候應(yīng)該去找第三方的包。
大浮點(diǎn)數(shù)操作類:BigDecimal
BigInteger 不能夠保存小數(shù)术浪,而BigDecimal可以保存小數(shù)數(shù)據(jù)瓢对。在BigDecimal里提供有如下幾種構(gòu)造:
- 構(gòu)造一:public BigDecimal(String val)。
- 構(gòu)造二:public BigDecimal(double val)添吗。
與BigInteger一樣沥曹,BigDecimal本身也支持基礎(chǔ)的數(shù)學(xué)計(jì)算份名,可是使用BigDecimal還有一個(gè)非常重要的目的碟联,就是可以使用它來實(shí)現(xiàn)準(zhǔn)確的四舍五入操作。
之前使用的Math.round()實(shí)現(xiàn)四舍五入操作僵腺,但是這種操作有一個(gè)問題鲤孵,所有的小數(shù)位都四舍五入了。
遺憾的是BigDecimal類里面沒有直接提供有四舍五入的操作支持辰如,可是可以利用除法實(shí)現(xiàn):
- 除法操作:public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)普监。
- BigDecimal divisor:被除數(shù)。
- int scale:保留的小數(shù)位琉兜。
- int roundingMode:進(jìn)位模式(public static final int ROUND_HALF_UP)凯正。
范例:實(shí)現(xiàn)準(zhǔn)確的四舍五入
public class MyMath {
/**
* 實(shí)現(xiàn)準(zhǔn)確位數(shù)的四舍五入操作
* @param num 要進(jìn)行四舍五入操作的數(shù)字
* @param scale 要保留的小數(shù)位
* @return 處理后的四舍五入數(shù)據(jù)
*/
public static double round(double num, int scale) {
BigDecimal bigA = new BigDecimal(num);
BigDecimal bigB = new BigDecimal(1);
return bigA.divide(bigB, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
public class TestDemo {
public static void main(String args[]) {
System.out.println(MyMath.round(19.783231231, 2));
System.out.println(MyMath.round(-15.5, 0));
System.out.println(MyMath.round(15.5, 0));
}
}
輸出結(jié)果
19.78
-16
16
此類操作的功能在日后的開發(fā)之中一定要會(huì)使用,屬于工具類的支持范疇豌蟋。
總結(jié)
- Math類重要要清楚round()方法的坑廊散。
- Random類生成隨機(jī)數(shù)。
- 如果數(shù)據(jù)量大就使用BigInteger或BigDecimal梧疲,這兩個(gè)類是Number的子類允睹。