电脑上按Ctrl + D,下次访问更方便
服务分类

BigDecimal使用不当,损失照样从你工资里扣

在金额计算中使用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的差别,在汇金领域,会产生非常大的金额差异。

发表回复

登录后才能评论
联系我们

联系我们

微信专属客服:

fuwu360微信客服

工作时间:周一至周五,9:30-18:30,节假日休息

返回顶部