Java关于大数处理Java.math里面有两个类:BigInteger 和 BigDecimal.前者是大整数处理,后者是高精度处理。其实两者的使用方法都是十分类似的,他们没有普通的数学运算符操作(+,-,*,/,%),所有这些操作都是通过函数来实现的,并且一般的函数参数也都是大数(BigDecimal或BigInteger对象)。
BigInteger的使用:
//求阶乘
@Test
public void test1(){
BigInteger bigInteger = new BigInteger("1");
for (int i = 1; i < 600; i++) {
bigInteger = bigInteger.multiply(BigInteger.valueOf(i));
}
System.out.println(bigInteger);
}
这里就展示乘法的使用,加法是add(),减法是delete(),除法是subtract(),使用方法十分简单,调用的时候里面可以new 对象,也可以使用valueOf()
BigDecimal的使用:
@Test
public void test1(){
BigDecimal b = new BigDecimal(0);
for (int i = 0; i < 10; i++) {
b = b.add(new BigDecimal(0.1));
}
System.out.println(b);
//1.0000000000000000555111512312578270211815834045410156250
}
观察输出可以知道,就算是高精度的处理也有她的局限性,但其实办法总比困难多的,请看下文:
@Test
public void test2(){
BigDecimal b = new BigDecimal(0);
for (int i = 0; i < 10; i++) {
b = b.add(new BigDecimal(0.1));
}
System.out.printf("%.1f",b);
//1.0
}
@Test
public void test3(){
BigDecimal b = new BigDecimal(0);
for (int i = 0; i < 10; i++) {
b = b.add(BigDecimal.valueOf(0.1));//没有后面的多余数据
}
System.out.println(b);
//1.0
}
我也有在网上看过别人写的方法,用的是API里面的scale,或者是DecimalFormat,都很麻烦,建议计算的时候使用下面这两种方法,至于为什么new BifDecimal 和 valueOf()两种方法的区别原由,可以通过看API知道,后者是使用了toString的方法,所以使用valueOf的时候数据转换为bigDecimal的时候是精确的