目录
背景
BigDecimal中的五个容易踩的坑
背景
之前给大家分享了一篇因为在金额计算中没有使用BigDecimal而导致故障的文章,但是除非在一些非常简单的场景,结算汇金类的业务也不会直接用BigDecimal来计算金额。
原因有两点:
BigDecimal里面还是有很多隐蔽的坑的BigDecimal没有提供金额的单位BigDecimal中的五个容易踩的坑
①newBigDecimal()还是BigDecimal#valueOf()?先看下面这段代码:BigDecimalbd1=newBigDecimal(0.01);BigDecimalbd2=BigDecimal.valueOf(0.01);System.out.println("bd1="+bd1);System.out.println("bd2="+bd2);输出到控制台的结果是:
bd1=0.bd2=0.01造成这种差异的原因是0.1这个数字计算机是无法精确表示的,送给BigDecimal的时候就已经丢精度了,而BigDecimal#valueOf的实现却完全不同。
publicstaticBigDecimalvalueOf(doubleval){//Reminder:azerodoublereturns0.0,sowecannotfastpath//tousetheconstantZERO.Thismightbeimportantenoughto//justifyafactoryapproach,acache,orafewprivate//constants,later.returnnewBigDecimal(Double.toString(val));}
它使用了浮点数相应的字符串来构造BigDecimal对象,因此避免了精度问题。
所以大家要尽量要使用字符串而不是浮点数去构造BigDecimal对象,如果实在不行,就使用BigDecimal#valueOf()方法吧。
②等值比较BigDecimalbd1=newBigDecimal("1.0");BigDecimalbd2=newBigDecimal("1.00");System.out.println(bd1.equals(bd2));System.out.println(bd1.