3.9 大数
java.math
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。
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方法
遗憾的是,不能使用人们熟悉的算术运算符(如:+和×)处理大数,而需要使用大数类中的add和multiply方法。
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分之一。祝你好运!