初識Java(Java數字處理類-大數字運算)


一、大數字運算

在 Java 中提供了大數字的操作類,即 java.math.BigInteger 類與  java.math.BigDecimal 類。這兩個類用於高精度計算,體重 BigInteger 類是針對大整數的處理類,而  BigDecimal  類則是針對大小數的處理類。

BigInteger 

  BigInteger  類型的數字范圍較 Integer 類型的數字范圍要大得多。 Integer 是 int 的包裝類, int 的最大值是 2³¹-1 ,如果要計算更大的數字,使用 Integer 數據類型就無法實現了,所以 Java 中提供了 BigInteger 類來處理更大的數字。

  BigInteger 支持任意精度的整數,也就是說在運算中 BigInteger 類型可以准確地表示任何大小的整數值而不會丟失任何信息。

     在 BigInteger 類中封裝了多種操作,除了基本的加、減、乘、除操作之外,還提供了絕對值、相反數、最大公約數以及判斷是否為質數等操作。

     使用 BigInteger 類,可以實例化一個 BigInteger 對象,並自動調用相應的構造函數。 BigInteger 類具有很多構造函數,但最直接的一種方式是參數以字符串形式代表要處理的數字。

     語法如下 :

public BigInteger(String val)

    其中 , val  是十進制字符串。

    如果將 2 轉換為 BigInteger 類型,可以使用一下語句進行初始化操作 :

BigInteger twoInstance = new BigInteger("2");     //將十進制 2 轉換為 BigInteger 形式

    參數 2 的雙引號不能省略,因為參數是以字符串的形式存在的。

    一旦創建了對象實例,就可以調用 BigInteger 類中的一些方法進行運算操作,包括基本的數學運算和位運算以及一些取相反數、取絕對值等操作。下面列舉幾種常用運算方法 :

( 1 ) public BigInteger add(BigInteger val)  :                     做加法運算
( 2 ) public BigInteger subtract(BigInteger val)  :                做減法運算
( 3 ) public BigInteger multiply(BigInteger val)  :                做乘法運算
( 4 ) public BigInteger divide(BigInteger val)  :                  做除法運算
( 5 ) public BigInteger remainder(BigInteger val)  :               做取余運算
( 6 ) public BigInteger[] divideAndRemainder (BigInteger val)  :   用數組返回余數和商,結果數組中第一個值為商,第二個值為余數
( 7 ) public BigInteger pow(int exponent)  :                       進行取參數的 exponent 次方操作
( 8 ) public BigInteger negate()  :                                取相反數
( 9 ) public BigInteger shiftLeft(int n)  :                        將數字左移 n 位,如果 n 為負數,做右移操作
( 10 )public BigInteger shiftRight(int n)  :                       將數字右移 n 位,如果 n 為負數,做左移操作
( 11 )public BigInteger and(BigInteger val) :                      做與操作
( 12 )public BigInteger or(BigInteger val)  :                      做或操作
( 13 )public int compareTo(BigInteger val)  :                      做數字比較操作
( 14 )public boolean equals(Object x)  :                           當參數 x 是 BigInteger 類型的數字並且數值相等時,返回 true15 )public BigInteger min(BigInteger val)   :                    返回較小的數值
( 16 )public BigInteger max(BigInteger val)   :                    返回較大的數值

    eg : 創建類,在類的主方法中創建 BigInteger 類的實例對象,調用該對象的各種方法實現大整數的加、減、乘、除和其他運算,並輸出運算結果。

import java.math.BigInteger;
public class BigIntegerDemo {
    public static void main(String[] args) {
        BigInteger bigInteger = new BigInteger("4");//實例化一個大數字
        System.out.println("加法操作:" + bigInteger.add(new BigInteger("2")));
        System.out.println("減法操作:" + bigInteger.subtract(new BigInteger("2")));
        System.out.println("乘法操作:" + bigInteger.multiply(new BigInteger("2")));
        System.out.println("除法操作:" + bigInteger.divide(new BigInteger("2")));
        System.out.println("取商操作:" + bigInteger.divideAndRemainder(new BigInteger("3"))[0]);
        System.out.println("取余數操作:" + bigInteger.divideAndRemainder(new BigInteger("3"))[1]);
        System.out.println("做 2 次方操作:" + bigInteger.pow(2));
        System.out.println("取相反數操作:" + bigInteger.negate());
    }
}

運行結果為 :

加法操作:6
減法操作:2
乘法操作:8
除法操作:2
取商操作:1
取余數操作:12 次方操作:16
取相反數操作:-4

BigDecimal

     BigDecimal 和  BigInteger 都能用來實現大數字的運算,不同的是 BigDecimal 加入了小數的概念。一般的 float 型和 double 型數據只可以用來做科學計算或工程計算,但由於在商業計算中要求數字精度比較高,所以要用到 java.math.BigDecimal 類。

  BigDecimal 類支持任何精度的定點數,可以用它來精確計算貨幣值。

  在 BigDecimal 類中常用的兩個構造方法如下 :

    public BigDecimal(double val) :    實例化時將雙精度型轉換為 BigDecimal 類型
    public BigDecimal(String val) :    實例化時將字符串形式轉換為 BigDecimal 類型

  BigDecimal 類型的數字可以用來做超大的浮點數的運算,如加、減、乘、除等,但是在所有的運算中除法是最復雜的,因為在除不盡的情況下末位小數點的處理是需要考慮的。

  下面列舉 BigDecimal 類中實現加、減、乘、除的方法 :

    public BigDecimal add(BigDecimal augend) :做加法操作
    public BigDecimal subtract(BigDecimal subtrahend) :做減法操作
    public BigDecimal multiply(BigDecimal multiplicand) :做乘法操作
    public BigDecimal divide(BigDecimal divisor , int sacle ,int roundingMode) :做除法操作,方法中 3 個參數分別代表除數、商的小數點后的位數、近似處理模式

  在上述方法中,BigDecimal 類中 divide() 方法有多種設置,用於返回商末位小數點的處理,這些模式的名稱與含義如下 :

  BigDecimal 類中 divide() 方法的多種處理模式
  模式    含義
    BigDecimal.ROUND_UP    s商的最后一位如果大於 0 ,則向前進位,正負數都如此
    BigDecimal .ROUND_DOWN    商的最后一位無論是什么數字都省略  

BigDecimal .ROUND_CEILING

  商如果是正數,按照 ROUND_UP 模式處理;

  如果是負數,按照 ROUND_DOWN 模式處理。

  這種模式的處理都會使近似值大於等於實際值。

BigDecimal .ROUND_FLOOR

  與 ROUND_CEILING 模式相反,

  商如果是正數,按照 ROUND_DOWN 模式處理;

  如果是負數,按照ROUND_UP 模式處理。

  這種模式的處理都會使近似值小於等於實際值。

BigDecimal .ROUND_HALF_DOWN

  對商進行四舍五入操作,如果商最后一位小於等於 5,則做舍棄操作;

  如果最后一位大於 5 ,則做進位操作,如 7.5 ≈ 7

BigDecimal .ROUND_HALF_UP

  對商進行四舍五入操作,如果商的最后一位小於 5 則舍棄;

  如果大於等於 5 ,進行進位操作,如 7.5 ≈ 8

BigDecimal ROUND_HALF_EVEN

  如果商的倒數第二位為奇數,則按照 ROUND_HALF_UP 處理;

  如果為偶數,則按照 ROUND_HALF_DOWN 處理,如 7.5 ≈ 8 , 8.5 ≈ 8

     eg  : 創建類,在類中分別定義 add() 、sub() 、mul() 和 div() 方法實現加、減、乘、除運算,並輸出運算結果。

import java.math.BigDecimal;
public class BigDecimalDemo {
    static final int location = 10;
    /**
     * 定義加法方法,參數為加數與被加數
     * @param value1 相加的第一個數
     * @param value2 相加的第二個數
     * @return 兩數之和
     */
    public BigDecimal add(double value1 , double value2) {
    //實例化 Decimal 對象
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.add(b2);        //調用加法方法
    }
    /**
     * 定義減法方法,參數為減數與被減數
     * @param value1 被減數
     * @param value2 減數
     * @return 運算結果
     */
    public BigDecimal sub(double value1 , double value2) {
    //實例化 Decimal 對象
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.subtract(b2);        //調用減法方法
    }
    /**
     * 定義乘法方法,參數為乘數與被乘數
     * @param value1 第一個乘數
     * @param value2 第二個乘數
     * @return 運算結果
     */
    public BigDecimal mul(double value1 , double value2) {
        //實例化 Decimal 對象
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.multiply(b2);        //調用乘法方法
    }
    /**
     * 定義除法方法,參數為除數與被除數
     * @param value1 被除數
     * @param value2 除數
     * @return 運算結果
     */
    public BigDecimal div(double value1 , double value2) {
        return div(value1, value2,location);//調用自定義除法方法
    }
    public BigDecimal div(double value1 , double value2 ,int b) {
        if (b<0) {
        System.out.println("b 值必須大於等於 0");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        //調用除法方法,商小數點保留 b 位,並將結果進行四舍五入操作
        return b1.divide(b2,b,BigDecimal.ROUND_HALF_UP);
    }
    public static void main(String[] args) {
        BigDecimalDemo b = new BigDecimalDemo();
        System.out.println("兩個數字相加結果:" + b.add(-7.5, 8.9));
        System.out.println("兩個數字相減結果:" + b.sub(-7.5, 8.9));
        System.out.println("兩個數字相乘結果:" + b.mul(-7.5, 8.9));
        System.out.println("兩個數字相除結果,結果小數后保留 10 位:" + b.div(10,2));
        System.out.println("兩個數字相除,保留小數后 5 位:" + b.div(-7.8,8.9,5));
    }
}

    運行結果為:

兩個數字相加結果:1.4
兩個數字相減結果:-16.4
兩個數字相乘結果:-66.75
兩個數字相除結果,結果小數后保留 10 位:5.0000000000
兩個數字相除,保留小數后 5 位:-0.87640

原文:https://blog.csdn.net/js940814/article/details/80210456 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM