天天看點

"Big"資料類助力大型資料運算 | 帶你學《Java語言進階特性》之二十一

上一篇:Math、Random類為你展現數學之美 | 帶你學《Java語言進階特性》之二十

随着科技的發展,計算機對運算的要求變得越來越高,傳統的float甚至double已經無法滿足。為了解決這類問題,出現了BigInteger、BigDecimal兩個操作大數字的類,本節将對這兩個類進行具體介紹。

【本節目标】

通過閱讀本節内容,你将了解到BigInteger、BigDecimal兩個類的相關内容,學會其兌現的簡單建立與方法調用,并能夠自行開發一些方法完成大數字運算時的性能調優。

大數字操作類

在進行數學計算的過程裡面還有一個大數字的操作類,可以實作海量數字的計算(能提供的也隻是基礎計算),現在假設一個數字很大,超過了double的範圍,那麼這個時候并沒有任何一種資料類型可以儲存下此類的内容,最早的時候隻能通過String儲存。

String strA="120";
String strB="230";           

如果現在想要進行加法計算,那麼就需要逐位拆分,每一位自己計算,而後自己獨立控制進位處理,那麼這樣的開發難度是非常高的,是以為了解決這類問題,提供有兩個大數字的操作類:BigInteger、BigDecimal。

"Big"資料類助力大型資料運算 | 帶你學《Java語言進階特性》之二十一

大數字類

之前分析了,當數字很大的時候隻能利用字元串描述數字操作,是以這一點可以觀察兩個大數字操作類的構造方法:

  • BigInteger類構造:public BigInteger​(String val);
  • BigDecimal類構造: public BigDecimal​(String val);

範例:使用BigInteger實作四則運算

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        BigInteger bigA=new BigInteger("234234234234234234");
        BigInteger bigB=new BigInteger("23423423");
        System.out.println("加法操作:"+bigA.add(bigB));    //234234234257657657
        System.out.println("減法操作:"+bigA.subtract(bigB));    //234234234210810811
        System.out.println("乘法操作:"+bigA.multiply(bigB));  //5486567549549549544062982
        System.out.println("除法操作:"+bigA.divide(bigB));      //10000000180
        
    }
}           

需要注意的是,雖然提供有大數字操作類,但是整體的操作之中還是需要考慮到一個性能問題。

範例:觀察性能問題

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        BigInteger bigA=new BigInteger("234234234234234234");
        System.out.println(bigA.pow(Integer.MAX_VALUE));
    }
}           
"Big"資料類助力大型資料運算 | 帶你學《Java語言進階特性》之二十一

cpu處理

此時的計算過程是非常緩慢的,是以任何的電腦是有極限的。

既然在進行數學除法的時候有可能無法進行整除處理,那麼就可以使用其他的除法計算來求出餘數:

  • 求餘:public BigInteger[] divideAndRemainder​(BigInteger val);數組第一個元素為商,第二個為餘數;

範例:求餘除法

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        BigInteger bigA = new BigInteger("234234234234234234");
        BigInteger bigB = new BigInteger("23423423");
        BigInteger[] result = bigA.divideAndRemainder(bigB);
        System.out.println("商:" + result[0] + "、餘數:" + result[1]);//商:100000000180、餘數:18018094
    }
}           

如果在開發中真進行計算的時候,該計算沒有超過基本資料類型所包含的位數強烈不建議使用大數字類,因為這種計算性能很差。

BigDecimal操作形式和BigInteger是非常類似的,都有基礎的數學支援。

範例:使用BigDecimal計算

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        BigDecimal bigA = new BigDecimal("32890234890");
        BigDecimal bigB = new BigDecimal("1892039");
        System.out.println("加法計算:"+bigA.add(bigB));   //32892126929
        BigDecimal result[] = bigA.divideAndRemainder(bigB);
        System.out.println("除法計算:商:" + result[0] + "、餘數:" + result[1]);//商:17383、餘數:920953
    }
}           

但是在使用BigDecimal的時候有一個資料進位的問題,在這個類裡面定義有如下的除法計算:

  • 除法計算:public BigDecimal divide​(BigDecimal divisor, int scale, RoundingMode roundingMode);

範例:使用BigDecimal實作四舍五入處理

class MathUtil {
    private MathUtil() {}
    /**
     * 實作資料的四舍五入操作
     *
     * @param num   要進行四舍五入操作的是數字
     * @param scale 四舍五入保留的小數位數
     * @return 四舍五入處理後的結果
     */
    public static double round(double num, int scale) {
        return new BigDecimal(num).divide(new BigDecimal(1.0), scale, RoundingMode.HALF_UP).doubleValue();
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        System.out.println(MathUtil.round(19.6352, 2));  //19.64
    }
}           

Math的處理由于使用的都是基本資料類型,是以性能一定要高于大數字處理類。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:一文教你掌握日期操作 | 帶你學《Java語言進階特性》之二十二 更多Java面向對象程式設計文章檢視此處