Java~處理超大數字與超高精度數字的API (BigInteger類和BigDecimal類)

BigInteger類

  • 在Java的整數類型裏面,byte爲8位,short爲16位,int爲32位,long爲64位。正因爲這些數值的二進制位數已經固定,所以它們能表示的數值大小就有一定的範圍限制。因此,Java中提供BigInteger類來處理更大的數字。

構造方法

  • BigInteger(String val):創建一個具有參數所指定以字符串表示的數值的對象。

常用方法

BigInteger add(BigInteger val):加法運算。

BigInteger subtract(BigInteger val):減法運算。

BigInteger multiply(BigInteger val) :乘法運算。

BigInteger divide(BigInteger val) :除法運算,可能會產生除零異常。

public BigInteger[] divideAndRemainder(BigInteger val):獲取商值和餘數組成的數組,初始元素是商值,最終元素是餘數。

String toString():將BigInteger對象的數值轉換成字符串。

double doubleValue():將BigInteger對象中的值以雙精度數返回。

float floatValue():將BigInteger對象中的值以單精度數返回。

long longValue():將BigInteger對象中的值以長整數返回。

int intValue():將BigInteger對象中的值以整數返回。

代碼演示

import java.math.BigInteger;

public class Test {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("222222222222222222222222");
        BigInteger b = new BigInteger("333333333333333333333333");
        System.out.println("add >>> " + a.add(b));
        System.out.println("subtract >>> " + a.subtract(b));
        System.out.println("multiply >>> " + a.multiply(b));
        System.out.println("divide >>> " + a.divide(b));
        System.out.println("divideAndRemainder[0] >>> " + a.divideAndRemainder(b)[0]);
        System.out.println("divideAndRemainder[1] >>> " + a.divideAndRemainder(b)[1]);
    }
}

在這裏插入圖片描述

BigDecimal類

  • 雖然Java的基本類型提供了float和double類型,但他們在執行浮點運算的時候,只是提供了一個較爲精確的結果,不能用於要求精確度很高的環境中。

  • 因此,Java提供了BigDecimal類來保證結果的精確度。

  • BigDecimal都是不可變的(immutable)的,在進行每一步運算時,都會產生一個新的對象,所以在做運算時千萬要保存操作後的值。

  • 使用BigDecimal的壞處是性能比double和float差,在處理龐大,複雜的運算時尤爲明顯,因根據實際需求決定使用哪種類型。

構造方法

BigDecimal(int):創建一個具有參數所指定整數值的對象。

BigDecimal(double):創建一個具有參數所指定雙精度值的對象(不建議使用會導致精度丟失)。

    public static void main(String[] args) {
             BigDecimal a = new BigDecimal(2);
             BigDecimal b = new BigDecimal(2.3);
             BigDecimal c = new BigDecimal("2.3");
             System.out.println(a);
             System.out.println(b);
             System.out.println(c);
    }

在這裏插入圖片描述
BigDecimal(String):創建一個具有參數所指定以字符串表示的數值的對象。

常用方法

BigDecimal add(BigDecimal augend):加法運算。

BigDecimal subtract(BigDecimal subtrahend):減法運算。

BigDecimal multiply(BigDecimal multiplicand):乘法運算。

BigDecimal divide(BigDecimal divisor):除法運算,可能會產生除零異常和不能整除異常。

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):除法運算,可傳入精確小數位數scale,和舍入模式roundingMode。

BigDecimal[] divideAndRemainder(BigDecimal divisor):獲取商值和餘數組成的數組,初始元素是商值,最終元素是餘數。

BigDecimal setScale(int newScale, int roundingMode):進行舍入操作。

String toString():將BigDecimal對象的數值轉換成字符串。

double doubleValue():將BigDecimal對象中的值以雙精度數返回。

float floatValue():將BigDecimal對象中的值以單精度數返回。

int intValue():將BigDecimal對象中的值以整數返回。

舍入模式

ROUND_UP:向遠離零的方向舍入。捨棄非零部分,並將非零捨棄部分相鄰的一位數字加一。

ROUND_DOWN:向接近零的方向舍入。捨棄非零部分,同時不會非零捨棄部分相鄰的一位數字加一,採取截取行爲。

ROUND_CEILING:向正無窮的方向舍入。如果爲正數,舍入結果同ROUND_UP一致;如果爲負數,舍入結果同ROUND_DOWN一致。

ROUND_FLOOR:向負無窮的方向舍入。如果爲正數,舍入結果同ROUND_DOWN一致;如果爲負數,舍入結果同ROUND_UP一致。

ROUND_HALF_UP:向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。這種模式也就是我們常說的我們的“四捨五入”。

ROUND_HALF_DOWN:向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則爲向下舍入的舍入模式。這種模式也就是我們常說的我們的“五舍六入”。

ROUND_HALF_EVEN:向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則相鄰的偶數舍入。如果捨棄部分左邊的數字奇數,則舍入行爲與ROUND_HALF_UP相同;如果爲偶數,則舍入行爲與ROUND_HALF_DOWN相同。四捨六入,五分兩種情況,如果前一位爲奇數,則入位,否則捨去。

ROUND_UNNECESSARY:斷言請求的操作具有精確的結果,因此不需要舍入。如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。

代碼演示

    public static void main(String[] args) {
             BigDecimal a = new BigDecimal("10.111111111111111111111");
             BigDecimal b = new BigDecimal("3.7777777777777777777777");
             System.out.println("add >>> " + a.add(b));
             System.out.println("subtract >>> " + a.subtract(b));
             System.out.println("multiply >>> " + a.multiply(b));
             System.out.println("divide >>> " + a.divide(b, 2, BigDecimal.ROUND_HALF_UP));
             System.out.println("divideAndRemainder[0] >>> " + a.divideAndRemainder(b)[0]);
             System.out.println("divideAndRemainder[1] >>> " + a.divideAndRemainder(b)[1]);
             System.out.println("四捨五入保留一位小數 >>> " + a.setScale(1, BigDecimal.ROUND_HALF_UP));
             System.out.println("四捨五入保留一位小數 >>> " + b.setScale(1, BigDecimal.ROUND_HALF_UP));
    }

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章