大数(BigDecimal和BigInteger)
之前说到了,浮点数由于计算机浮点表示方法会有精度丢失问题,那涉及到浮点数的情况时(如银行卡金额),该怎么样进行运算呢?
我们可以使用Java.math 包下的两个类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值,前者实现任意精度的整数运算,后者实现任意精度的浮点数运算。
使用静态valueof方法将普通数值转换为大数
BigInteger bigInteger = BigInteger.valueOf(100);
对于非常大的数,可以使用带字符串参数的构造方法
BigInteger bigInteger = new BigInteger("123154674816531354684651354135413535241");
由于数字类型的改变,之前的运算符无法满足大数的运算,所以要用这个两个类提供的add(),divide(),multiply(),subtract()分别对应+,/,*,-
例子,求在n个数字中抽取k个数字的概率
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你想抽取的k个数字");
int k= scanner.nextInt();
System.out.println("请输入最大的数字n");
int n= scanner.nextInt();
BigInteger chance = BigInteger.valueOf(1);
for (int i = 1; i <= k; i++) {
chance = chance.multiply(BigInteger.valueOf(n-i+1)).divide(BigInteger.valueOf(i));
}
System.out.println("在"+n+"个数字中抽取"+k+"个数据的概率为1/"+chance+",祝你好运");
}
}