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));
}