Java數(shù)字操作類

導(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的子類允睹。

更多內(nèi)容戳這里(整理好的各種文集)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市幌氮,隨后出現(xiàn)的幾起案子缭受,更是在濱河造成了極大的恐慌,老刑警劉巖该互,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件米者,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宇智,警方通過查閱死者的電腦和手機(jī)蔓搞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門陆盘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人败明,你說我怎么就攤上這事隘马。” “怎么了妻顶?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵酸员,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我讳嘱,道長(zhǎng)幔嗦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任沥潭,我火速辦了婚禮邀泉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钝鸽。我一直安慰自己汇恤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布拔恰。 她就那樣靜靜地躺著因谎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颜懊。 梳的紋絲不亂的頭發(fā)上财岔,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音河爹,去河邊找鬼。 笑死咸这,一個(gè)胖子當(dāng)著我的面吹牛夷恍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炊苫,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼劣砍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了廓啊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤盖灸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后磺芭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钾腺,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徙垫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放棒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻报。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖间螟,靈堂內(nèi)的尸體忽然破棺而出吴旋,到底是詐尸還是另有隱情,我是刑警寧澤厢破,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布荣瑟,位于F島的核電站,受9級(jí)特大地震影響溉奕,放射性物質(zhì)發(fā)生泄漏褂傀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一加勤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧同波,春花似錦鳄梅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冤狡,卻和暖如春孙蒙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悲雳。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工挎峦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人合瓢。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓坦胶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顿苇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容