概念
BigDecimal 可以实现对浮点数的运算,不会造成精度丢失。BigDecimal 是 Java 语言中的一个类,它位于 java.math 包中。BigDecimal 类被设计用来进行高精度的浮点数运算,它提供了一种可以用来进行任意精度的算术运算的方式。BigDecimal 通常用于需要高精度计算的金融领域,例如货币计算。
业务场景
通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过BigDecimal 来做的
《阿里巴巴 Java 开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断
特点
高精度
BigDecimal 可以表示任意精度的小数,并且其精度不会因为计算而丢失。
不可变
BigDecimal 类的实例是不可变的,这意味着一旦创建了 BigDecimal 对象,就不能更改其值。
线程安全
BigDecimal 类是线程安全的,可以在多线程环境中安全使用。
常用方法
add(BigDecimal augend):加法运算。
subtract(BigDecimal subtrahend):减法运算。
multiply(BigDecimal multiplicand):乘法运算。
divide(BigDecimal divisor, int scale, RoundingMode roundingMode):除法运算,可以指定小数点后的位数和舍入模式
这里需要注意的是,在我们使用 divide 方法的时候尽量使用 3 个参数版本,并且RoundingMode 不要选择 UNNECESSARY,否则很可能会遇到 ArithmeticException(无法除尽出现无限循环小数的时候),其中 scale 表示要保留几位小数,roundingMode 代表保留规则
解决问题
想要解决浮点数运算精度丢失这个问题,可以直接使用 BigDecimal 来定义浮点数的值,然后再进行浮点数的运算操作即可
大小比较
注意:BigDecimal 的等值比较应该使用comepareTo( )方法,而不是equals( )方法!!!