1. 程式人生 > >java大數類-----BigDecimal和BigInteger

java大數類-----BigDecimal和BigInteger

大整數操作—BigInteger類

  • 應用場景 正常情況下,整數的型別中,能表示的最大整數必然是Long型別,為8個位元組,但如果有這麼一個數字為132456489745156784165458784156 因為 long型別 的整數範圍是有限的,在 Java中 引入了專門用來進行大數操作的一個類 —— BigInteger類。
  • 方法
    • 構造方法 這裡寫圖片描述
    • 方法

這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述

  • 例子
import java.math.BigInteger;

public class Test {
    public static void main(String[] args) {
        // 用來儲存 兩個大數
BigInteger b1 = new BigInteger("987654321098765432109876543210"); BigInteger b2 = new BigInteger("123456789012345678901234567890"); // 兩個大數的運算(加減乘除、最大值、最小值) System.out.println("b1 + b2 = " + b1.add(b2)); // 加 System.out.println("b1 - b2 = " + b1.subtract(b2)); // 減
System.out.println("b1 * b2 = " + b1.multiply(b2)); // 乘 System.out.println("b1 / b2 = " + b1.divide(b2)); // 除 System.out.println("max: " + b1.max(b2)); // 最大值 System.out.println("min: " + b1.min(b2)); // 最小值 System.out.println(); // 除法操作,陣列的第一個元素是除法的商,第二個元素是除法的餘數
BigInteger[] bArr = b1.divideAndRemainder(b2); System.out.println("商:" + bArr[0]); System.out.println("餘數:" + bArr[1]); } }

這裡寫圖片描述

大小數操作—-BigDecimal類

  • 應用 在日常開發中我們經常會碰到小數運算,而小數直接進行運算的話會出現一些,請看下列程式碼:
System.out.println(2.00 - 1.10);

  如果不看輸出結果,我們很有可能會認為輸出的是 0.9,可真正輸出的卻是0.8999999999999999。這是為什麼呢?這是因為我們計算機在進行浮點運算時,採用的是二進位制運算,這樣做非常容易導致精度丟失(如上列程式碼)。 所以進行小數的精確計算,需要用到BigDecimal類

  • 欄位摘要 這裡寫圖片描述
  • 構造方法 這裡寫圖片描述 這裡寫圖片描述
  • 方法 這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述

BigDecimal舍入模式

儘管資料庫儲存的是一個高精度的浮點數,但是通常在應用中展示的時候往往需要限制一下小數點的位數,比如兩到三位小數即可,這時就需要使用到setScale(int newScale, int roundingMode)函式,作為BigDecimal的公有靜態變數,舍入模式(Rounding Mode)的運算規則比較多,公有八種,這裡作個說明,官方文件也有介紹。

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

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

ROUND_CEILING
向正無窮的方向舍入。如果為正數,舍入結果同ROUND_UP一致;如果為負數,舍入結果同ROUND_DOWN一致。注意:此模式不會減少數值大小。

ROUND_FLOOR
向負無窮的方向舍入。如果為正數,舍入結果同ROUND_DOWN一致;如果為負數,舍入結果同ROUND_UP一致。注意:此模式不會增加數值大小。

ROUND_HALF_UP
向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入的舍入模式。如果捨棄部分>= 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“四捨五入”。

ROUND_HALF_DOWN
向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向下舍入的舍入模式。如果捨棄部分> 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“五舍六入”。

ROUND_HALF_EVEN
向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則相鄰的偶數舍入。如果捨棄部分左邊的數字奇數,則舍入行為與 ROUND_HALF_UP 相同;如果為偶數,則舍入行為與 ROUND_HALF_DOWN 相同。注意:在重複進行一系列計算時,此舍入模式可以將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。四捨六入,五分兩種情況,如果前一位為奇數,則入位,否則捨去。

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