java中的BigInteger类和BigDecimal类的应用

来源:互联网 发布:中国和德国的关系 知乎 编辑:程序博客网 时间:2024/04/28 21:00

JAVA的两个类BigIntegerBigDecimal分别表示大整数类和大浮点数类,理论上能够表示无限大的数。


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)


Fieldsfinal public static BigDecimalZERO
zh_cn值为 0,标度为 0。since1.5
final public static BigDecimalONE
zh_cn值为 1,标度为 0。since1.5
final public static BigDecimalTEN
zh_cn值为 10,标度为 0。since1.5
final public static intROUND_UP
zh_cn舍入远离零的舍入模式。在丢弃非零部分之前始终增加数字。注意,此舍入模式始终不会减少计算值的大小。
final public static intROUND_DOWN
zh_cn接近零的舍入模式。在丢弃某部分之前始终不增加数字(即截短)。注意,此舍入模式始终不会增加计算值的大小。
final public static intROUND_CEILING
zh_cn接近正无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。注意,此舍入模式始终不会减少计算值。
final public static intROUND_FLOOR
zh_cn接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。注意,此舍入模式始终不会增加计算值。
final public static intROUND_HALF_UP
zh_cn向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分 >= 0.5,则舍入行为与ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。注意,这是我们大多数人在小学时就学过的舍入模式。
final public static intROUND_HALF_DOWN
zh_cn向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP相同;否则舍入行为与 ROUND_DOWN 相同。
final public static intROUND_HALF_EVEN
zh_cn向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
final public static intROUND_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  等

原创粉丝点击