BigDecimal
计算机中的小数
double和float的弊端
| 类型 | 占用字节数 | 总bit位数 | 小数部分bit位数 |
|---|---|---|---|
| float | 4个字节 | 32个bit位 | 23个bit位 |
| double | 8个字节 | 64个bit位 | 52个bit位 |
当小数的二进制形式的所占bit位数过长,超过float和double类型小数部分的bit位数时就不得不舍去超过的bit位数,这样就导致了数据不精确
BigDecimal的作用
- 用于小数的精确计算
- 用来表示很大的数
BigInteger构造方法
| 方法名 | 说明 |
|---|---|
| public BigDecimal(double val) | 通过传递double类型的小数来创建对象 |
| public BigDecimal(String val) | 通过传递字符串表示的小数来创建对象 |
| public static BigDecimal valueOf(double val) | 通过静态方法获取对象 |
-
BigDecimal(double val)细节
- 这种方式有可能是不精确的,所以不建议使用
-
BigDecimal(String val)细节
- 如果要表示的数字比较大,超出了double的取值范围,建议使用构造方法
-
BigDecimal valueOf(double val)细节
- 底层调用的是Double类中的toString方法
- 如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
- 如果我们传递的是0 ~ 10(包含0,包含10)之间的整数,那么方法会返回已经创建好的对象,不会重新new
public static BigDecimal valurOf(double val) {
return new BigDecimal(Double.toString(val));
}
BigDecimal常见成员方法
| 方法名 | 说明 |
|---|---|
| public static BigDecimal valueOf(double val) | 获取对象 |
| public BigDecimal add(BigDecimal val) | 加法 |
| public BigDecimal subtract(BigDecimal val) | 减法 |
| public BigDecimal multipy(BigDecimal val) | 乘法 |
| public BigDecimal divide(BigDecimal val) | 除法 |
| public BigDecimal divide(BigDecimal val, int scale, RoundingMode roundingMode) | 除法 |
- 除法
- 除不尽时,及结果是无限小数,会报错,这时需要精确除法
- scale:小数点后保留几位
- roundingMode:舍入模式
RoundingMode
- 枚举类,定义了一些舍入模式
- 这些舍入模式由常量定义,即由publi static final修饰
- 在获取常量时使用
RoundingMode.常量的格式
| 枚举常量 | 说明 |
|---|---|
| UP | 向远离0方向舍入 |
| DOWN | 向靠近0的方向舍入 |
| CEILING | 向正无限大的方向舍入 |
| FLOOR | 向负无限大的方向舍入 |
| HALF_UP | 四舍五入 |
| HALF_EVEN | 四舍六入,五往偶数方向舍入 |
| HALF_DOWN | 五舍六入 |
BigDecimal底层存储方式
- 我们在获取BigDecimal对象时,不管是通过构造方法获取还是静态方法获取,最终的对象都是new出来的
- 当参数是一个字符串形式的小数,先遍历这个字符串,得到每一个字符
- 再将这些字符转换为ACSII表中对应的数值存储在一个byte数组中
BigDecimal存储上限
小数的长度不能超过int的最大值