Java BigDecimal

261 阅读2分钟

BigDecimal

计算机中的小数

Snipaste_2022-10-23_16-33-27.png

Snipaste_2022-10-23_16-33-57.png

double和float的弊端

Snipaste_2022-10-23_16-35-02.png

类型占用字节数总bit位数小数部分bit位数
float4个字节32个bit位23个bit位
double8个字节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数组

Snipaste_2022-10-23_17-45-39.png

BigDecimal存储上限

小数的长度不能超过int的最大值