项目背景:今天开发一个功能,需要将数据库存储的金额,通过加减乘除以后,保留两位小数点返回给前端展示(前端展示的单位为元,数据库存储的值单位为分)
第一种方式:
BigDecimal freeAmountBig = new BigDecimal(freeAmount);
BigDecimal temp = new BigDecimal(100);
freeAmountBig = freeAmountBig.divide(temp, 2, RoundingMode.HALF_UP);
这种是先将Integer转为BigDecimal 对象,再通过BigDecimal 的除法运算将结果保留两位小数,这样就成功将运算结果转换为元为单位返回给前端;
第二种方式:
Integer temp = 9877665;
BigDecimal avl = new BigDecimal((double) temp / 100);
String avlblAmt = avl.setScale(2,BigDecimal.ROUND_HALF_UP).toString();
这种是先将Integer除以100,并将结果强转为double,然后再将double类型转为BigDecimal,最后将BigDecimal类型保留两位小数返回。
我这边是推荐使用第一种,因为不管是double还是float类型都是会丢失精度的,而BigDecimal是不会丢失精度的,而且可以灵活设置保留的小数位,保留小数位的策略有8种,RoundingMode.HALF_UP只是其中比较常用的一种。大家有兴趣的话可以去研究下这块。下面我改成这样,你们觉得会不会有问题:
Integer temp = 9877662;
BigDecimal avl = new BigDecimal((float) temp / 100);
String avlblAmt = avl.setScale(2,BigDecimal.ROUND_HALF_UP).toString();
肯定是有问题的,会丢失掉最后一位分的精度。我要的结果应该是98776.62元,但是这几行代码的运算结果就不是了,它应该是:98776.60元。不信你们可以试下