BigInteger和BigDecimal这两个类都在 java.math 包里,都是用来解决"普通数字类型不够用"的问题。
- BigInteger:处理特别大的整数。
- BigDecimal:处理精确的小数,尤其适合金额计算。
一.BigInteger
1.1 BigInteger是什么:
BigInteger 是 Java 提供的一个类,用来表示:特别大的整数。
1.2 为什么要有BigInteger:
普通整数类型有范围限制:如int long。数字超过 long 的范围,普通整数类型就装不下。
这时可以使用 BigInteger ,它可以表示非常非常大的整数。
1.3 创建 BigInteger 对象
对象一旦创建,内部值就不可变
| 类型 | 方法 / 构造方法 | 说明 |
|---|---|---|
| 构造方法 | public BigInteger(String val) | 获取指定的大整数 |
| 静态方法 | public static BigInteger valueOf(long val) | 静态方法获取 BigInteger 对象,内部有优化 |
1.3.1 构造方法创建对象(new)
每一次都是创建了一个新的BigInteger对象。用==比较是false。
java
BigInteger num = new BigInteger("999999999999999999999");
1.3.2 静态方法创建对象(valueOf)
用valueOf创建对象时,当BigInteger加载到内存的时候,提前把 -16~16 之间每一个小整数都创建了BigInteger 对象 ,共33个,放入到数组中(缓存优化)。重复获取这些数字时,可以复用已有对象。
也就是当你创建两个16,用==比较,是true,创建两个17,就是false
目的:跟Integer(默认缓存:-128 ~ 127)是一样的,当使用频率高的时候,节约内存
注意 :valueOf里传的只能是**long类型数据(**最高19位)
java
BigInteger a = BigInteger.valueOf(16);
1.4 BigInteger 的常见成员方法
| 方法名 | 说明 |
|---|---|
| public BigIntegeradd(BigInteger val) | 加法 |
| public BigInteger subtract(BigInteger val) | 减法 |
| public BigInteger multiply(BigInteger val) | 乘法 |
| public BigIntegerdivide(BigInteger val) | 除法,获取商 |
| public BigInteger\[\] divideAndRemainder(BigInteger val) | 除法,获取商和余数 |
| public boolean equals(Object x) | 比较是否相同 |
| public BigIntegerpow(int exponent) | 次幂 |
| public BigInteger max(BigInteger val) | 返回最大值 |
| public BigInteger min(BigInteger val) | 返回最小值 |
二.BigDecimal
2.1 什么是BigDecimal
BigDecimal 是 Java 提供的一个类,用来表示:精确的小数。
2.2 为什么要有BigDecimal
因为 double 和 float 计算小数可能有**精度问题。**计算机底层用二进制表示小数,很多十进制小数不能被精确表示。
BigDecimal的作用:
- 用来表示很大的小数
- 用于小数的精确计算
BigDecimal的存储规则:
用 byte 类型的数组存储小数里的数据(把小数里面的每一个数字提取出来,用ASCII码表示,然后存在数组当中),避免数据丢失,保证数据的精确运算
2.3 创建 BigDecimal对象
结论:
如果当前的小数,是在double的取值范围之内的,使用静态方法获取对象
如果超出了double的取值范围,使用构造方法获取对象(参数必须要以字符串的形式进行体现)
| 构造方法 | 说明 |
|---|---|
| public BigDecimal(double val) | 获取指定的 BigDecimal 对象,不推荐使用 |
| public BigDecimal(String val) | 获取指定的 BigDecimal 对象,推荐使用 |
| 静态方法 | 说明 |
|---|---|
| public static BigDecimal valueOf(long val) | 静态方法获取 BigDecimal 对象,内部有优化 |
2.3.1 构造方法获取对象(new)
注意:
- 给构造方法传递一个double类型的小数(错误)
- 传递过来的数据就是不精确的
java
BigDecimal b1 = new BigDecimal("1.5");
2.3.2 静态方法获取对象(valueOf)
缓存优化:0~10提前创建好,放到数组当中
java
BigDecimal b2 = BigDecimal.valueOf(1.5);
2.4 BigDecimal类的常见成员方法
| 方法名 | 说明 |
|---|---|
| public static BigDecimal valueOf(double val) | 获取对象 |
| public BigDecimal **add(**BigDecimal val) | 加法 |
| public BigDecimal subtract(BigDecimal val) | 减法 |
| public BigDecimalmultiply(BigDecimal val) | 乘法 |
| public BigDecimal divide(BigDecimal val) | 除法,获取商 |
| public BigDecimaldivide(BigDecimal val, int scale, RoundingMode roundingMode) | 除法,指定精确位数和舍入模式(保留小数整体) |
舍入规则:
四舍五入:RoundingMode.HALF_UP


