1. 程式人生 > >JAVA之大數操作及小數操作(BigInteger類、BigDecimal類)

JAVA之大數操作及小數操作(BigInteger類、BigDecimal類)

  今天我們來講講在 Java中 經常被忽視的兩個細節 —— 大數操作與小數操作。

  本篇將對如何使用 BigInteger類BigDecimal類 進行大數操作與小數操作做簡要講解,幫助大家快速掌握其用法。。(BigInteger類 與 BigDecimal類 都在 java.math包 中

本文可以分為兩大部分:

  一、大數操作 —— BigInteger類

  二、小數操作 —— BigDecimal類

一、大數操作 —— BigInteger類

1、應用場景

  在正常情況下一個整數最多隻能儲存在 long型別中,但如果有這麼個數字:123456789012345678901234567890

  我們就頭疼了,因為 long型別 的整數範圍是有限的,無法儲存這麼大的一個數字,更不用說做大數運算了,那該怎麼辦呢?為了解決這一個問題,在 Java中 引入了專門用來進行大數操作的一個類 —— BigInteger類

  有了 BigInteger類,我們可以很方便的進行大數的操作。當然了,這些大數的資料都會以字串的形式寫入。

2、舉個栗子

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]); } }
BigInteger輸出結果

3、常用方法

NO. 方法 型別 描述
1 public BigInteger(String val) 構造 將一個字串變為 BigInteger型別的資料
2 public BigInteger add(BigInteger val) 普通 加法
3 public BigInteger subtract(BigInteger val) 普通 減法
4 public BigInteger multiply(BigInteger val) 普通 乘法
5 public BigInteger divide(BigInteger val) 普通 除法
6 public BigInteger max(BigInteger val) 普通 最大值
7 public BigInteger min(BigInteger val) 普通 最小值
8 public BigInteger[] divideAndRemainder(BigInteger val) 普通 除法操作,陣列的第一個元素表示除法的商,
第二個元素表示除法的餘數

二、小數操作 —— BigDecimal類

1、應用場景

  在日常開發中我們經常會碰到小數運算,而小數直接進行運算的話會出現一些,請看下列程式碼:

System.out.println(2.00 - 1.10);

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

  那遇到這種問題到底該怎麼辦呢?彆著急,為了解決這一個問題,在 Java中 又引入一種了專門用來進行小數操作的一個類 —— BigDecimal類

  自從有了 BigDecimal類,我們不僅可以很方便的進行小數的操作,而且再也不會發生精度丟失的問題了。當然了,這些小資料都也是以字串的形式寫入,因為如果使用浮點形式寫入,又會發生精度丟失的問題了。

2、舉個栗子

import java.math.BigDecimal;

public class Test {
    public static void main(String[] args) {
        // 用來儲存 兩個小數
        BigDecimal b1 = new BigDecimal("1.00");
        BigDecimal b2 = new BigDecimal("0.30");

        // 兩個小數的運算(加減乘除、最大值、最小值)
        System.out.println("b1 + b2 = " + b1.add(b2));        // 加
        System.out.println("b1 - b2 = " + b1.subtract(b2));   // 減
        System.out.println("b1 * b2 = " + b1.multiply(b2));   // 乘
        // 除法,開始四捨五入模式,否則可能會報 ArithmeticException
        System.out.println("b1 / b2 = " + b1.divide(b2, BigDecimal.ROUND_HALF_UP));
        System.out.println("max: " + b1.max(b2));        // 最大值
        System.out.println("min: " + b1.min(b2));        // 最小值
        System.out.println();

        // 除法操作,陣列的第一個元素是除法的商,第二個元素是除法的餘數
        BigDecimal[] bArr = b1.divideAndRemainder(b2);
        System.out.println("商:" + bArr[0]);
        System.out.println("餘數:" + bArr[1]);
    }
}
BigDecimal輸出結果

3、常用方法

NO. 方法 型別 描述
1 public BigDecimal(String val) 構造 將一個字串變為 BigDecimal型別的資料
2 public BigDecimal add(BigDecimal augend) 普通 加法
3 public BigDecimal subtract(BigDecimal subtrahend) 普通 減法
4 public BigDecimal multiply(BigDecimal multiplicand) 普通 乘法
5 public BigDecimal divide(BigDecimal divisor) 普通 除法
6 public BigDecimal max(BigDecimal val) 普通 最大值
7 public BigDecimal min(BigDecimal val) 普通 最小值
8 public BigDecimal[] divideAndRemainder(BigDecimal divisor) 普通 除法操作,陣列的第一個元素表示除法的商,
第二個元素表示除法的餘數