竹笋

首页 » 问答 » 环境 » BigDecimal,切记别再用错了
TUhjnbcbe - 2023/7/14 21:17:00

目录

背景

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.

1
查看完整版本: BigDecimal,切记别再用错了