Java核心技术卷I基础知识(原书第9版)
上QQ阅读APP看书,第一时间看更新

3.9 大数值

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

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

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

C++注释:与C++不同,Java没有提供运算符重载功能。程序员无法重定义+和*运算符,使其应用于BigInteger类的add和multiply运算。Java语言的设计者确实为字符串的连接重载了+运算符,但没有重载其他的运算符,也没有给Java程序员在自己的类中重载运算符的机会。

程序清单3-6是对程序清单3-5中彩概率程序的改进,使其可以采用大数值进行运算。假设你被邀请参加抽奖活动,并从490个可能的数值中抽取60个,这个程序将会得到中彩概率1/716395843461995557415116222540092933411717612789263493493351013459481104668848。祝你好运!

在程序清单3-5中,用于计算的语句是

如果使用大数值,则相应的语句为:

程序清单3-6 BigIntegerTest/BigIntegerTest.java

API java.math.BigInteger 1.1

·BigInteger add(BigInteger other)

·BigInteger subtract(BigInteger other)

·BigInteger multiply(BigInteger other)

·BigInteger divide(BigInteger other)

·BigInteger mod(BigInteger other)

返回这个大整数和另一个大整数other的和、差、积、商以及余数。

·int compareTo(BigInteger other)

如果这个大整数与另一个大整数other相等,返回0;如果这个大整数小于另一个大整数other,返回负数;否则,返回正数。

·static BigInteger valueOf(long x)

返回值等于x的大整数。

API java.math.BigInteger 1.1

·BigDecimal add(BigDecimal other)

·BigDecimal subtract(BigDecimal other)

·BigDecimal multiply(BigDecimal other)

·BigDecimal divide(BigDecimal otherRoundingMode mode)5.0

返回这个大实数与另一个大实数other的和、差、积、商。要想计算商,必须给出舍入方式(rounding mode)。RoundingMode.HALF_UP是在学校中学习的四舍五入方式(即,数值0到4舍去,数值5到9进位)。它适用于常规的计算。有关其他的舍入方式请参看API文档。

·int compareTo(BigDecimal other)

如果这个大实数与另一个大实数相等,返回0;如果这个大实数小于另一个大实数,返回负数;否则,返回正数。

·static BigDecimal valueOf(long x)

·static BigDecimal valueOf(long x,int scale)

返回值为x或x/10scale的一个大实数。