3.9 大数


java.math

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中两个很有用的类:BigIntegerBigDecimal。这两个类可以处理包含任意长度数字序列的数值。

BigInteger类

BigInteger类实现任意精度的整数运算

BigDecimal类

BigDecimal类实现任意精度的浮点数运算。

静态的valueOf方法

使用静态的valueOf方法可以将普通的数值转换为大数:

BigInteger a = BigInteger.valueOf(100);

程序示例

import java.math.BigInteger;

public class HuangZiHanTest
{  
   public static void main(String[] args)
   {   
	   int huangzihan100 = 100;
	   int huangzihan1314 = 1314;
	   int huangzihan123456789 = 123456789;
	   
	   BigInteger huangzihanValueOf100 = BigInteger.valueOf(100);
	   BigInteger huangzihanValueOf1314 = BigInteger.valueOf(1314);
	   BigInteger huangzihanValueOf123456789 = BigInteger.valueOf(123456789);
	   
	   System.out.println(huangzihan100);
	   System.out.println(huangzihan1314);
	   System.out.println(huangzihan123456789);
	   System.out.println();
	   System.out.println(huangzihanValueOf100);
	   System.out.println(huangzihanValueOf1314);
	   System.out.println(huangzihanValueOf123456789);
   }
}

运行结果

100
1314
123456789

100
1314
123456789

带字符串参数的构造器

对于更大的数,可以使用一个带字符串参数的构造器:

BigInteger reallyBig = new BigInteger("222232244629428445529739893461909967206666939096499764998979600");

程序示例

import java.math.BigInteger;

public class HuangZiHanTest
{  
   public static void main(String[] args)
   {   
	   BigInteger huangzihan123456789987654321 = new BigInteger("123456789987654321");
	   BigInteger huangzihan123456789123456789123456789 = new BigInteger("123456789123456789123456789");
	   System.out.println(huangzihan123456789987654321);
	   System.out.println(huangzihan123456789123456789123456789);
   }
}

运行结果

123456789987654321
123456789123456789123456789

另外还有一些常量:BigInteger.ZERO、BigInteger.ONE和BigInteger.TEN,Java 9之后还增加了BigInteger.TWO。

add和multiply方法

遗憾的是,不能使用人们熟悉的算术运算符(如:+和×)处理大数,而需要使用大数类中的addmultiply方法。

BigInteger c = a.add(b);     //c=a+b 
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));    //d=c*(b+2)

程序示例

import java.math.BigInteger;

public class HuangZiHanTest
{  
   public static void main(String[] args)
   {   
	   BigInteger huangzihanA = BigInteger.valueOf(123456789);
	   BigInteger huangzihanB = BigInteger.valueOf(987654321);
	   BigInteger huangzihanC = huangzihanA.add(huangzihanB);
	   System.out.println(huangzihanC);
	   
	   BigInteger huangzihanD = huangzihanC.multiply(huangzihanB.add(BigInteger.valueOf(2)));
	   System.out.println(huangzihanD);
   }
}

运行结果

1111111110
1097393691124828530

程序示例

运行结果

你需要画多少个数字?
5
你能画的最高数字是什么?
10
你的几率是252分之一。祝你好运!