大数值
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的分类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
使用静态的valueOf方法可以将普通的数值转化为大数值:
BigInteger x = BigInteger.valueOf(100);
遗憾的是,不能使用人们熟悉的算数运算符(如:+和*)处理大数值。而需要使用大数值类中的add和multiply方法。
BigInteger x = BigInteger.valueOf(100);
BigInteger y = BigInteger.valueOf(200);
//计算100*(200+300)的值
BigInteger z = x.multiply(y.add(BigInteger.valueOf(300)));
注意:与C++不同,java没有提供运算符重载功能。程序员无法重定义+和*运算符,使其应用于BigInteger类的add和multiply运算,java语言的设计者确实为字符串的连接重载了+运算符,但没有重载其他的运算符,也没有给java程序员在值机的类中重载运算符的机会!
下面是一个简单的应用实例:假设你被邀请参加抽奖活动,并从390个可能的数值中抽取60个,这个程序将会得到中彩概率为:1/7163958434619957415116222540092933411717612789263493493351013459481104668848.
class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("How many numbers do you need to draw? ");
int k=in.nextInt();
System.out.print("What is the highest number you can draw? ");
int n=in.nextInt();
BigInteger lotterOdds = BigInteger.valueOf(1);
for(int i=1;i<=k;i++) {
lotterOdds = lotterOdds.multiply(BigInteger.valueOf(n-i+1)).divide(BigInteger.valueOf(i));
}
System.out.println("Your odds are 1 in "+lotterOdds + ". Good luck!");
}
}
一些常用的API:
//返回这个大整数和另一个大正数other的和、差、积、商以及余数
BigInteger add(BigInteger other)
BigInteger substract(BigInteger other)
BigInteger multiply(BigInteger other)
BigInteger divide(BigInteger other)
BigInteger mod(BigInteger other)
//如果这个大整数与另一个大整数other相等,返回0;
//小于另一个大整数other的话会发挥一个负数;否则返回正数。
int compareTo(BigInteger other)
//返回值等于x的大整数
static BigInteger valueOf(long x)
浮点型大数值与整数型大数值API几乎一样。
唯一区别:要想计算商,必须给出舍入方式。RoundingMode.HALF_UP是在学校中学习的四舍五入方式。它使用与常规的运算。