C語言中文網 目錄

Java大數字運算(BigInteger類和BigDecimal類)

Java 中提供了用于大數字運算的類,即 java.math.BigInteger 類和 java.math.BigDecimal 類。這兩個類用于高精度計算,其中 BigInteger 類是針對整型大數字的處理類,而 BigDecimal 類是針對大小數的處理類。

BigInteger 類

如果要存儲比 Integer 更大的數字,Integer 數據類型就無能為力了。因此,Java 中提供 BigInteger 類來處理更大的數字。

BigInteger 類型的數字范圍較 Integer 類型的數字范圍要大得多。BigInteger 支持任意精度的整數,也就是說在運算中 BigInteger 類型可以準確地表示任何大小的整數值

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

要使用 BigInteger 類,首先要創建一個 BigInteger 對象。BigInteger 類提供了很多種構造方法,其中最直接的一種是參數以字符串形式代表要處理的數字。這個方法語法格式如下:
BigInteger(String val)

這里的 val 是數字十進制的字符串。例如,要將數字 5 轉換為 BigInteger 對象,語句如下:
BigInteger bi=new BigInteger("5")

注意:這里數字 5 的雙引號是必需的,因為 BigInteger 類構造方法要求參數是字符串類型。

創建 BigInteger 對象之后,便可以調用 BigInteger 類提供的方法進行各種數學運算操作,表 1 列出了 BigInteger 類的常用運算方法。

表1 BigInteger類的常用運算方法
方法名稱 說明
add(BigInteger val) 做加法運算
subtract(BigInteger val) 做減法運算
multiply(BigInteger val) 做乘法運算
divide(BigInteger val) 做除法運算
remainder(BigInteger val) 做取余數運算
divideAndRemainder(BigInteger val) 做除法運算,返回數組的第一個值為商,第二個值為余數
pow(int exponent) 做參數的 exponent 次方運算
negate() 取相反數
shiftLeft(int n) 將數字左移 n 位,如果 n 為負數,則做右移操作
shiftRight(int n) 將數字右移 n 位,如果 n 為負數,則做左移操作
and(BigInteger val) 做與運算
or(BigInteger val) 做或運算
compareTo(BigInteger val) 做數字的比較運算
equals(Object obj) 當參數 obj 是 Biglnteger 類型的數字并且數值相等時返回 true, 其他返回 false
min(BigInteger val) 返回較小的數值
max(BigInteger val) 返回較大的數值

例 1

編寫一個 Java 程序,將用戶輸入的數字作為 BigInteger 對象,然后調用該對象的各種方法實現加、減、乘、除和其他運算,并輸出結果。具體實現代碼如下:
import java.math.BigInteger;
import java.util.Scanner;
public class Test09
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        System.out.println("請輸入一個整型數字:");
        //保存用戶輸入的數字
        int num=input.nextInt();

        //使用輸入的數字創建BigInteger對象
        Biglnteger bi=new BigInteger(num+"");

        //計算大數字加上99的結果
        System.out.println("加法操作結果:"+bi.add(new BigInteger("99")));

        //計算大數字減去25的結果
        System.out.println("減法操作結果:"+bi.subtract(new BigInteger("25")));

        //計算大數字乘以3的結果
        System.out.println("乘法橾作結果:"+bi.multiply(new BigInteger("3")));

        //計算大數字除以2的結果
        System.out.println("除法操作結果:"+bi.divide(new BigInteger("2")));

        //計算大數字除以3的商
        System.out.println("取商操作結果:"+bi.divideAndRemainder(new BigInteger("3"))[0]);

        //計算大數字除以3的余數
        System.out.println("取余操作結果:"+bi.divideAndRemainder(new BigInteger("3"))[1]);

        //計算大數字的2次方
        System.out.println("取 2 次方操作結果:"+bi.pow(2));

        //計算大數字的相反數
        System.out.println("取相反數操作結果:"+bi.negate());
    }
}

上述代碼將用戶輸入的整型數字保存到 num 變量中,由于 BigInteger 類的構造方法只接收字符串類型的參數,所以使用“new BigInteger(num+"")” 代碼來創建 BigInteger 對象。接下來的代碼演示了如何調用 BigInteger 類提供的運算方法,運行效果下所示。
請輸入一個整型數字:
125
加法操作結果:224
減法操作結果:100
乘法橾作結果:375
除法操作結果:62
取商操作結果:41
取余操作結果:2
取 2 次方操作結果:15625
取相反數操作結果:-125

BigDecimal 類

BigInteger 和 BigDecimal 都能實現大數字的運算,不同的是 BigDecimal 加入了小數的概念。一般的 float 和 double 類型數據只能用來做科學計算或工程計算,但由于在商業計算中要求數字精度比較高,所以要用到 BigDecimal 類。BigDecimal 類支持任何精度的浮點數,可以用來精確計算貨幣值。

BigDecimal 常用的構造方法如下。
  • BigDecimal(double val):實例化時將雙精度型轉換為 BigDecimal 類型。
  • BigDecimal(String val):實例化時將字符串形式轉換為 BigDecimal 類型。

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

下面列出了 BigDecimal 類用于實現加、減、乘和除運算的方法。
BigDecimal add(BigDecimal augend)    //加法操作
BigDecimal subtract(BigDecimal subtrahend)    //減法操作
BigDecimal multiply(BigDecimal multiplieand)    //乘法操作
BigDecimal divide(BigDecimal divisor,int scale,int roundingMode )    //除法操作
其中,divide() 方法的 3 個參數分別表示除數、商的小數點后的位數和近似值處理模式。

表 2 列出了 roundingMode 參數支持的處理模式。

表2 roundingMode參數支持的處理模式
模式名稱 說明
BigDecimal.ROUND_UP 商的最后一位如果大于 0,則向前進位,正負數都如此
BigDecimal.ROUND_DOWN 商的最后一位無論是什么數字都省略
BigDecimal.ROUND_CEILING 商如果是正數,按照 ROUND_UP 模式處理;如果是負數,按照 ROUND_DOWN
模式處理
BigDecimal.ROUND_FLOOR 與 ROUND_CELING 模式相反,商如果是正數,按照 ROUND_DOWN 模式處理;
如果是負數,按照 ROUND_UP 模式處理
BigDecimal.ROUND_HALF_ DOWN 對商進行五舍六入操作。如果商最后一位小于等于 5,則做舍棄操作,否則對最后
一位進行進位操作
BigDecimal.ROUND_HALF_UP 對商進行四舍五入操作。如果商最后一位小于 5,則做舍棄操作,否則對最后一位
進行進位操作
BigDecimal.ROUND_HALF_EVEN 如果商的倒數第二位是奇數,則按照 ROUND_HALF_UP 處理;如果是偶數,則按
照 ROUND_HALF_DOWN 處理

例 2

編寫一個 Java 程序,演示如何使用 BigDecimal 類提供的方法對數字執行運算,并輸出結果。具體實現代碼如下:
import java.math.BigDecimal;
import java.util.Scanner;
public class Test10
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        System.out.println("請輸入一個數字:");

        //保存用戶輸入的數字
        double num=input.nextDouble();

        //使用輸入的數字創建BigDecimal對象
        BigDecimal bd=new BigDecimal(num);

        //計算大數字加上99.154的結果
        System.out.println("加法操作結果:"+bd.add(new BigDecimal(99.154)));

        //計算大數字減去-25.157904的結果
        System.out.println("減法操作結果:"+bd.subtract(new BigDecimal(-25.157904)));

        //計算大數字乘以3.5的結果
        System.out.println("乘法操作結果:"+bd.multiply(new BigDecimal(3.5)));

        //計算大數字除以3.14的結果,并保留小數后2位
        System.out.println("除法操作結果(保留 2 位小數):"+bd.divide(new BigDecimal(3.14),2,BigDecimal.ROUND_CEILING));

        //計算大數字除以3.14的結果,并保留小數后5位
        System.out.println("除法操作結果(保留 5 位小數):"+bd.divide(new BigDecimal(3.14),5,BigDecimal.ROUND_CEILING));
    }
}

上述代碼將用戶輸入的數字保存到 num 變量中,然后調用“newBigDecimal(num)”方法來創建 BigDecimal 對象。接下來的代碼演示了如何調用 BigDecimal 類提供的運算方法,運行效果如下所示。
請輸入一個數字:
100
加法操作結果:199.15399999999999636202119290828704833984375
減法操作結果:125.157903999999998490011421381495893001556396484375
乘法操作結果:350.0
除法操作結果(保留 2 位小數):31.85
除法操作結果(保留 5 位小數):31.84714

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo