java中的BigInteger類和BigDecimal類的應用

來源:互聯網
上載者:User

JAVA的兩個類BigInteger和BigDecimal分別表示大整數類和大浮點數類,理論上能夠表示無限大的數。


BigInteger表示:

package com.xujin;import java.util.*;import java.math.*;public class Test {public static void main(String[] args) {Scanner cin = new Scanner(System.in);//BigInteger類型的常量BigInteger A = BigInteger.ONE;System.out.println("BigInteger.ONE的結果為 " + A);//1BigInteger B = BigInteger.TEN;System.out.println("BigInteger.TEN的結果為 " + B);//10BigInteger C = BigInteger.ZERO;System.out.println("BigInteger.ZERO的結果為 " + C);//0//初始化BigInteger c = new BigInteger("12345670",8);//c = 01234567890 ,八進位System.out.println(c);//2739128BigInteger d = BigInteger.valueOf(100);//d = 100BigInteger e = new BigInteger(new byte[]{1,0});//00000001 00000000System.out.println(e);//256System.out.println(e.bitCount());System.out.println(e.bitLength());//運算System.out.println("請輸入大整數a,b");    while (cin.hasNext()) {//等同於!=EOFBigInteger a = cin.nextBigInteger();BigInteger b = cin.nextBigInteger();BigInteger c1 = a.add(b); // 大數加法System.out.println("加的結果為 " + c1);BigInteger c2 = a.subtract(b); // 大數減法System.out.println("減的結果為 " + c2);BigInteger c3 = a.multiply(b); // 大數乘法System.out.println("乘的結果為 " + c3);BigInteger c4 = a.divide(b); // 大數除法System.out.println("除的結果為 " + c4);BigInteger c5 = a.mod(b);System.out.println("模的結果為 " + c5);BigInteger cc5 = a.remainder(b);System.out.println("餘的結果為 " + cc5);BigInteger c6 = a.max(b);// 取最大System.out.println("最大為 " + c6);BigInteger c7 = a.min(b); // 取最小System.out.println("最小為 " + c7);BigInteger c8 = a.pow(10); //指數運算System.out.println("指數運算結果為" + c8);if (a.equals(b)) // 判斷是否相等System.out.println("相等");elseSystem.out.println("不相等");BigInteger c10 = a.abs(); // 求絕對值System.out.println("a的絕對值為 " + c10);BigInteger c11 = a.negate(); // 求相反數System.out.println("a的相反數為 " + c11);}}}


BigDecimal表示:

//建立BigDecimal對象   

BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");   

BigDecimal bigRate = new BigDecimal(1000);   

BigDecimal bigResult = new BigDecimal(); //對象bigResult的值為0.0   

注意,BigDecimal中的divide函數和BigInteger中的稍有不同。

方法1:
pubilc BigDecimal divide(BigDecimal divisor)    

API中的解釋: 返回一個 BigDecimal,其值為 (this / divisor),其首選標度為 (this.scale() - divisor.scale());如果無法表示準確的商值(因為它有無窮的十進位擴充),則拋出 ArithmeticException。

方法2:
pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

scale指的是小數點後的位元。比如123.456則scale就是3,是BigDecimal類中的方法啊。    比如:BigDecimal b = new BigDecimal("123.456");//b.scale(),返回的就是3.
  roundingMode是小數的保留模式。它們都是BigDecimal中的常量欄位。

比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是說:我用一個BigDecimal對象除以divisor後的結果,並且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式,是四捨五入啊還是其它的,你可以自己選! 


方法3:
pubilc BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

Fields
final public static BigDecimal ZERO
zh_cn

值為 0,標度為 0。

since 1.5
final public static BigDecimal ONE
zh_cn

值為 1,標度為 0。

since 1.5
final public static BigDecimal TEN
zh_cn

值為 10,標度為 0。

since 1.5
final public static int ROUND_UP
zh_cn

舍入遠離零的舍入模式。在丟棄非零部分之前始終增加數字。注意,此舍入模式始終不會減少計算值的大小。

final public static int ROUND_DOWN
zh_cn

接近零的舍入模式。在丟棄某部分之前始終不增加數字(即截短)。注意,此舍入模式始終不會增加計算值的大小。

final public static int ROUND_CEILING
zh_cn

接近正無窮大的舍入模式。如果 BigDecimal 為正,則舍入行為與 ROUND_UP 相同;如果為負,則舍入行為與 ROUND_DOWN 相同。注意,此舍入模式始終不會減少計算值。

final public static int ROUND_FLOOR
zh_cn

接近負無窮大的舍入模式。如果 BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;如果為負,則舍入行為與 ROUND_UP 相同。注意,此舍入模式始終不會增加計算值。

final public static int ROUND_HALF_UP
zh_cn

向“最接近的”數字舍入,如果與兩個相鄰數位距離相等,則為向上舍入的舍入模式。如果捨棄部分 >= 0.5,則舍入行為與ROUND_UP 相同;否則舍入行為與 ROUND_DOWN 相同。注意,這是我們大多數人在小學時就學過的舍入模式。

final public static int ROUND_HALF_DOWN
zh_cn

向“最接近的”數字舍入,如果與兩個相鄰數位距離相等,則為上舍入的舍入模式。如果捨棄部分 > 0.5,則舍入行為與 ROUND_UP相同;否則舍入行為與 ROUND_DOWN 相同。

final public static int ROUND_HALF_EVEN
zh_cn

向“最接近的”數字舍入,如果與兩個相鄰數位距離相等,則向相鄰的偶數舍入。如果捨棄部分左邊的數字為奇數,則舍入行為與 ROUND_HALF_UP 相同;如果為偶數,則舍入行為與 ROUND_HALF_DOWN 相同。注意,在重複進行一系列計算時,此舍入模式可以將累加錯誤減到最小。

final public static int ROUND_UNNECESSARY
zh_cn

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

與上面的大整數同樣的函數:

package com.xujin;import java.util.*;import java.math.*;public class Test {public static void main(String[] args) {Scanner cin = new Scanner(System.in);//BigDecimal類型的常量BigDecimal A = BigDecimal.ONE;System.out.println("BigDecimal.ONE的結果為 " + A);//1BigDecimal B = BigDecimal.TEN;System.out.println("BigDecimal.TEN的結果為 " + B);//10BigDecimal C = BigDecimal.ZERO;System.out.println("BigDecimal.ZERO的結果為 " + C);//0//初始化BigDecimal c = new BigDecimal("89.1234567890123456789");BigDecimal d = new BigDecimal(100);BigDecimal e = new BigDecimal(new char[]{'2','1','.','2'});System.out.println(e);//21.2//運算System.out.println("請輸入大整數a,b");    while (cin.hasNext()) {//等同於!=EOFBigDecimal a = cin.nextBigDecimal();BigDecimal b = cin.nextBigDecimal();BigDecimal c1 = a.add(b); // 大數加法System.out.println("加的結果為 " + c1);BigDecimal c2 = a.subtract(b); // 大數減法System.out.println("減的結果為 " + c2);BigDecimal c3 = a.multiply(b); // 大數乘法System.out.println("乘的結果為 " + c3);//注意,這裡如果不能除盡,就會拋出一個ArithmeticException錯誤BigDecimal c4 = a.divide(b); // 大數除法System.out.println("除的結果為 " + c4);BigDecimal cc5 = a.remainder(b);System.out.println("餘的結果為 " + cc5);BigDecimal c6 = a.max(b);// 取最大System.out.println("最大為 " + c6);BigDecimal c7 = a.min(b); // 取最小System.out.println("最小為 " + c7);BigDecimal c8 = a.pow(10); //指數運算System.out.println("指數運算結果為" + c8);if (a.equals(b)) // 判斷是否相等System.out.println("相等");elseSystem.out.println("不相等");BigDecimal c10 = a.abs(); // 求絕對值System.out.println("a的絕對值為 " + c10);BigDecimal c11 = a.negate(); // 求相反數System.out.println("a的相反數為 " + c11);}}}

實用格式轉換:

//去尾碼0  BigDecimal bd = new BigDecimal("12000.87300");  bd = bd.stripTrailingZeros();  System.out.println(bd);  bd = new BigDecimal("1.2E-3");//  bd = new BigDecimal("1.2E+3");  //去科學記數  if(bd.scale()<0){   bd = bd.setScale(0);  }  System.out.println(bd);  //保留N位小數.  N=5:  bd = new BigDecimal("12000.873000");  bd = bd.setScale(5, BigDecimal.ROUND_HALF_UP);  System.out.println(bd); 

參考資料:
java API  http://doc.java.sun.com/DocWeb/api/java.math.BigDecimal

http://blog.163.com/wangyongfei_2008@yeah/blog/static/1722383292011535174177/

http://qingfengxia2.blog.163.com/blog/static/25478407201012442119977/

http://www.cnblogs.com/ffjjqqjj/archive/2011/07/14/2105893.html  等

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.