Java——BigInteger类和BigDecimal类
Java——BigInteger類和BigDecimal類
摘要:本文主要學習了用于大數字運算的BigInteger類和BigDecimal類。
部分內容來自以下博客:
https://www.cnblogs.com/LeoBoy/p/6056394.html
https://www.cnblogs.com/linjiqin/p/3413894.html
使用BigInteger類
為什么要使用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對象中的值以整數返回。
使用代碼
代碼如下:
1 public void test() { 2 BigInteger a = new BigInteger("10"); 3 BigInteger b = new BigInteger("3"); 4 System.out.println("add >>> " + a.add(b)); 5 System.out.println("subtract >>> " + a.subtract(b)); 6 System.out.println("multiply >>> " + a.multiply(b)); 7 System.out.println("divide >>> " + a.divide(b)); 8 System.out.println("divideAndRemainder[0] >>> " + a.divideAndRemainder(b)[0]); 9 System.out.println("divideAndRemainder[1] >>> " + a.divideAndRemainder(b)[1]); 10 }運行結果如下:
1 add >>> 13 2 subtract >>> 7 3 multiply >>> 30 4 divide >>> 3 5 divideAndRemainder[0] >>> 3 6 divideAndRemainder[1] >>> 1使用BigDecimal類
為什么要使用BigDecimal類
雖然Java的基本類型提供了float和double類型,但他們在執行浮點運算的時候,只是提供了一個較為精確的結果,不能用于要求精確度很高的環境中。
因此,Java提供了BigDecimal類來保證結果的精確度。
BigDecimal都是不可變的(immutable)的,在進行每一步運算時,都會產生一個新的對象,所以在做運算時千萬要保存操作后的值。
使用BigDecimal的壞處是性能比double和float差,在處理龐大,復雜的運算時尤為明顯,因根據實際需求決定使用哪種類型。
使用float和double導致精度缺失
在使用基本類型的float和double的時候,可能會出現精度缺失的問題,代碼如下:
1 public void test() { 2 System.out.println(0.2 + 0.1); 3 System.out.println(0.3 - 0.1); 4 System.out.println(0.2 * 0.1); 5 System.out.println(0.3 / 0.1); 6 }運行結果如下:
1 0.30000000000000004 2 0.19999999999999998 3 0.020000000000000004 4 2.9999999999999996我們使用BigDecimal類來解決使用浮點類型導致精度缺失的問題。
構造方法
BigDecimal(int):創建一個具有參數所指定整數值的對象。
BigDecimal(double):創建一個具有參數所指定雙精度值的對象(不建議使用)。
BigDecimal(String):創建一個具有參數所指定以字符串表示的數值的對象。
不使用傳入double的構造方法
因為float和double會導致精度缺失的問題,所以不建議使用將double作為參數的構造方法,代碼如下:
1 public void test() { 2 BigDecimal a = new BigDecimal(2); 3 BigDecimal b = new BigDecimal(2.3); 4 BigDecimal c = new BigDecimal("2.3"); 5 System.out.println(a); 6 System.out.println(b); 7 System.out.println(c); 8 }運行結果如下:
1 2 2 2.29999999999999982236431605997495353221893310546875 3 2.3常用方法
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。
使用代碼
代碼如下:
1 public void test() { 2 BigDecimal a = new BigDecimal(10); 3 BigDecimal b = new BigDecimal(3); 4 System.out.println("add >>> " + a.add(b)); 5 System.out.println("subtract >>> " + a.subtract(b)); 6 System.out.println("multiply >>> " + a.multiply(b)); 7 // System.out.println("divide >>> " + a.divide(b));// Non-terminating decimal expansion; no exact representable decimal result. 8 System.out.println("divide >>> " + a.divide(b, 2, BigDecimal.ROUND_HALF_UP)); 9 System.out.println("divideAndRemainder[0] >>> " + a.divideAndRemainder(b)[0]); 10 System.out.println("divideAndRemainder[1] >>> " + a.divideAndRemainder(b)[1]); 11 }運行結果如下:
1 add >>> 13 2 subtract >>> 7 3 multiply >>> 30 4 divide >>> 3.33 5 divideAndRemainder[0] >>> 3 6 divideAndRemainder[1] >>> 1轉載于:https://www.cnblogs.com/shamao/p/10943539.html
總結
以上是生活随笔為你收集整理的Java——BigInteger类和BigDecimal类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs code golang代码自动补全
- 下一篇: 第十一章 网络编程