1.Java大数值处理方案
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算
使用静态的valueOf方法可以将普通的数值转换为大数值:
BigInteger a = BigInteger.valueOf(100); System.out.println(a); // 100
2.BigInteger
该类实现了大整数的运算
大整数的和、差、积、商以及余数运算:
// BigInteger BigInteger bigInteger = new BigInteger("11111111111111111111111"); BigInteger bigInteger1 = new BigInteger("12345678910"); // + BigInteger addRes = bigInteger.add(bigInteger1); System.out.println(addRes); // 11111111111123456790021 // - BigInteger subRes = bigInteger.subtract(bigInteger1); System.out.println(subRes); // 11111111111098765432201 // * BigInteger mulRes = bigInteger.multiply(bigInteger1); System.out.println(mulRes); // 137174210111111111111109739369010 // / BigInteger divRes = bigInteger.divide(bigInteger1); System.out.println(divRes); // 900000007461 // % BigInteger modRes = bigInteger.mod(bigInteger1); System.out.println(modRes); // 763601
BigInteger还提供了数值比较方法compareTo:
int compareTo(BigInteger other):
如果这个大整数与另一个大整数other相等,返回0;如果这个大整数小于另一个大整数other,返回负数;否则,返回正数
BigInteger bigInteger = new BigInteger("11111111111111111111111"); BigInteger bigInteger1 = new BigInteger("12345678910"); int i = bigInteger.compareTo(bigInteger1); System.out.println(i); // 1
3.BigDecimal
该类实现了超高精度的浮点数运算
大实数的和、差、积、商运算:
// BigDecimal BigDecimal bigDecimal = new BigDecimal("1.1111111111111111111999999999999"); BigDecimal bigDecimal1 = new BigDecimal("1.234567"); // + BigDecimal daddRes = bigDecimal.add(bigDecimal1); System.out.println(daddRes); // 2.3456781111111111111999999999999 // - BigDecimal dsubRes = bigDecimal.subtract(bigDecimal1); System.out.println(dsubRes); // -0.1234558888888888888000000000001 // * BigDecimal dmulRes = bigDecimal.multiply(bigDecimal1); System.out.println(dmulRes); // 1.3717411111111111112208503999998765433 // /,注意:如果不指定精度,结果是死循环小数,会抛出一个异常 // 该例指定得到一个四舍五入的结果 BigDecimal ddivRes = bigDecimal.divide(bigDecimal1, BigDecimal.ROUND_HALF_UP); System.out.println(ddivRes); // 0.9000006570004796104221156081443