要点提示:BigInteger和BigDecimal类可以用于表示任意大小和精度的整数或者十进制数。
如果要进行非常大的数的计算或者高精度浮点值的计算,可以使用java.math包中的BigInteger和BigDecimal类。他们都是不可变的。long类型的最大整数值为
long.MAX_VALUE(即9223372036854775807)。BigInteger的实例可以表示任意大小的整数。可以使用new BigInteger(String)和new BigDecimal(String)来创建BigInteger和BigDecimal的实例,使用add、subtract、multiple、divide和remainder方法完成算数运算,使用compareTo方法比较两个大数字。例如下面代码创建两个BigInteger对象并且将它们进行相乘:
BigInteger a = new BigInteger("9223372036854775807"); BigInteger b = new BigInteger("2"); BigInteger c = a.multiply(b);//9223372036854775807*2 System.out.println(c);
它的输出为18446744073709551614。
对BigDecimal对象的精度没有限制。如果结果不能终止,那么divide方法会抛出ArithmeticException异常。但是可以使用重载divide(BigDecimal d,int scale,int roundingMode)方法来指定制度和摄入方式来避免这个异常,这里的scale是指小数点后最小的整数位数。例如下面的代码创建两个尺度为20、摄入方式为BigDecimal.ROUND_UP的BigDecimal对象。
BigDecimal a = new BigDecimal(1.0); BigDecimal b = new BigDecimal(3); BigDecimal c= a.divide(b,20,BigDecimal.ROUND_UP); Sysyem.out.println(c);
输出为0.33333333333333333334。
注意,一个整数的阶乘可能会很大,下面的程序给出可以返回任意整数阶乘的方法。
LargeFactorial.java
package ohhh; import java.math.*; public class LargeFactorial { public static void main(String[] args){ System.out.println("50! is\n"+factorial(50));} public static BigInteger factorial(long n){ BigInteger result=BigInteger.ONE;//等价于=new BigInteger("1") for(int i=1;i<=n;i++) result=result.multiply(new BigInteger(i+""));//BigInteger(String) return result; } }
输出结果是:
50! is30414093201713378043612608166064768844377641568960512000000000000