前言
我们都知道,在java中整数最大的也就是long型,浮点数最大的也就是double。它们的精度都是有限的,如果遇到更大或者要求小数点后精确到1000位该怎么做呢?在java中有无限精度的数据类型吗?当然是有的,java提供了BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。
- BigInteger类实现任意精度的整数运算
- BigDecimal实现任意精度的浮点数运算
BigInteger
BigInteger类可以完成任意整数的运算,不会造成精度的丢失,BigIntege的创建有2种方式,分别是通过new和valueOf方法进行创建,使用如下
// 初始化可以使用new,传入一个字符串即可
BigInteger bigInteger = new BigInteger("1");
// 初始化也可以使用BigInteger.valueOf(),传入一个long型即可
BigInteger bigInteger1 = BigInteger.valueOf(1);
对于BigInteger,因为这是一个类,肯定不能使用基本的运算符进行操作,所以我们要使用api完成各种运算操作,下面列出了常见的一些操作
// BigInteger.ONE表示1,BigInteger还提供了另外其他几个常用的常数
// 如BigInteger.TEN表示10,BigInteger.ZERO表示0
// 加法
BigInteger add = bigInteger.add(BigInteger.ONE);
// 减法
BigInteger subtract = bigInteger.subtract(BigInteger.ONE);
// 乘法
BigInteger multiply = bigInteger.multiply(BigInteger.ONE);
// 除法
BigInteger divide = bigInteger.divide(BigInteger.ONE);
// 取余
BigInteger mod = bigInteger.mod(BigInteger.ONE);
// 平方根,要求jdk11+
BigInteger sqrt = bigInteger.sqrt();
// 幂运算
BigInteger pow = bigInteger.pow(3);
// 两个大数进行比较,小于返回-1,大于返回1,相等返回0
int compareTo = bigInteger.compareTo(bigInteger1);
BigDecimal
BigDecimal可以完成任意精度的浮点数运算,用法和BigInteger Api基本相同.这里就不进行赘述了。下面位创建BigDecimal的2种方式
BigDecimal bigDecimal1 = new BigDecimal("1.1");
BigDecimal bigDecimal2 = BigDecimal.valueOf(1.2);
BigInteger和BigDecimal除法有一些区别,因为因为浮点数除法可能会产生循环。我们需要指定小数后面需要保留的位数
// 所以我们在使用divide的时候可以指定舍入的方法(如四舍五入),以及保留的位数
// divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
// divisor除数,scale保留多少位小数,roundingMode舍入模式
BigDecimal divide = bigDecimal1.divide(bigDecimal2, 17, RoundingMode.HALF_UP);
RoundingMode.HALF_UP这个就是表示使用四舍五入