JAVA之大數操作及小數操作(BigInteger類、BigDecimal類)
阿新 • • 發佈:2018-12-30
今天我們來講講在 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]);
}
}
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]);
}
}
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) | 普通 | 除法操作,陣列的第一個元素表示除法的商, 第二個元素表示除法的餘數 |