BigDecimal使用不当,损失照样从你工资里扣
Java •
在金额计算中使用double、float类型的,都被开除了。但是,千万不要以为用了BigDecimal就万事大吉,计算结果就一定精确。BigDecimal也有坑,使用不当,造成了损失,老板照样从你工资里面扣。
一般金额的计算,精度要求高,用BigDecimal是没问题的。但如果只要求精确到分,也可以把元转换为分,也就是乘以100,用整数来计算。例如腾讯的微信支付,发送给腾讯的金额都是整数,都是多少分这样的整数,但这只适用于简单的场景。
下面聊一下BigDecimal需要注意的几个问题。
1.尽量要使用字符串而不是浮点数去构造BigDecimal对象
要尽量要使用字符串而不是浮点数去构造BigDecimal对象,如果实在不行,就使用BigDecimal.valueOf()方法吧。
2.BigDecimal做除法运算要指定精度和舍入模式
BigDecimal 在进行除法运算(divide)时一定要注意:如果被除数为变量,一定要指定精度和舍入模式,否则会报:Non-terminating decimal expansion; no exact representable decimal result
3. 执行顺序不能调换(乘法交换律失效)
乘法满足交换律是一个常识,但是在计算机的世界里,会出现不满足乘法交换律的情况
BigDecimal a = BigDecimal.valueOf(1.0);
BigDecimal b = BigDecimal.valueOf(3.0);
BigDecimal c = BigDecimal.valueOf(3.0);
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP).multiply(c)); // 0.990
System.out.println(a.multiply(c).divide(b, 2, RoundingMode.HALF_UP)); // 1.00别小看这这0.01的差别,在汇金领域,会产生非常大的金额差异。

