BigDecimal是java.math包中提供的一个API类,专门用于对有效位数大于16位的数字进行精确运算。一般来说,对于不需要精确精度的计算,我们可以使用float或者double来进行计算,但是如果我们需要精确的计算结果,就必须使用BigDecimal类来进行操作。而BigDecamal本质上是一个对象,所以不能直接使用+、-、*、/等传统算术运算符。今天我们就来看看使用BigDecimal时容易踩到的5个陷阱。1、初始化错误BigDecimal提供了很多初始化方法,但是需要注意的是,当我们使用double等浮点数初始化时,可能会得到意想不到的结果。当我们使用浮点数进行初始化时,由于它是一个不确定的值,在传递给BigDecimal进行初始化时已经丢失了精度,因此看起来像一个错误。一般来说,建议你在初始化的时候转成String或者使用BigDecimal.valueOf方法。2.错误的等效比较方法。equal方法将比较两个BigDecimal对象的精度。如果精度不同,就会被认为是两个不同的对象。如果要比较两个对象的大小,推荐使用compareTo方法。3.不指定精度可能会导致异常。如果除法的商是无限小数,而我们没有指定精度,程序就会抛出异常。我们在使用BigDecimal的时候,要时刻记得指定精度,避免精度问题带来的损失。4.toString方法的格式当我们要将BigDecimal.valueOf构造的BigDecimal转换成String时,我们应该明白toString方法和toPlainString方法的区别。toString:必要时使用科学记数法。toPlainString:不使用科学记数法。toEngineeringString:工程计算中常用的记录数字的方法,类似于科学记数法,但要求10的次方必须是3的倍数。5.执行顺序不同导致的结果差异在进行算术运算时,交换律的乘法将得到满足,但它不适用于BigDecimal。不同的执行顺序会得到不同的结果。对于财务需求,0.1的差异足以让你消除bug到半夜。小结1.BigDecimal虽然计算精度准确,但是相对于double和float,性能还是比较差的。如果没有高精度计算的需求,也没有必要强行使用BigDecimal。2、初始化BigDecimal时,建议强制使用字符串构造参数。3、BigDecimal对象是不可变的,每次计算都会生成一个新的对象,所以计算完成后记得保存这个值。
