上QQ阅读APP看书,第一时间看更新
1.4.6 大数
如果基本类型的整数和浮点数的精度无法满足实际需求,那么可以使用java.math包中的BigInteger类和BigDecimal类。这些类的对象可以表示具有任意长度数字序列的数值。BigInteger类可以实现任意精度的整数运算,BigDecimal也可以对浮点数实现同样的功能。当然,使用大数的计算效率远远低于使用基本数据类型的计算效率。
静态方法valueOf可以将long类型转换为BigInteger:
BigInteger n = BigInteger.valueOf(876543210123456789L);
你还可以从数字形式的字符串中构造一个BigInteger的对象:
var k = new BigInteger("9876543210123456789");
此外还有一些预定义的常量,例如,BigInteger.ZERO、BigInteger.ONE、BigInteger.TWO和BigInteger.TEN。
Java不允许对象使用运算符,因此必须调用对应的方法来处理大数的运算。
BigInteger r = BigInteger.valueOf(5).multiply(n.add(k)); // r = 5 * (n + k)
1.2.2 小节中,你看到了浮点数减法 2.0 - 1.7的结果为0.30000000000000004。使用BigDecimal类可以计算出精确结果。
调用BigDecimal.valueOf(n, e)将返回一个值为n×10−e 的BigDecimal实例。例如,以下方法调用将准确地得到结果0.3:
BigDecimal.valueOf(2, 0).subtract(BigDecimal.valueOf(17, 1))