fengzf的gravatar头像
fengzf2020-08-22 15:20:23

BigDecimal先乘后除与先除后乘结果为什么差别那么大?

程序中用BigDecimal进行折扣率计算,计算结果异常

discountAmount =230.00   precision=0   scale=2
orderAmount=730.00    precision=5   scale=2
BigDecimal settlementRatio = discountAmount.multiply(new BigDecimal(100)).divide(orderAmount,2,BigDecimal.ROUND_HALF_UP);

结果:230.00*100/730.00=32.2

BigDecimal settlementRatio = discountAmount.divide(orderAmount,4,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP);

结果:230.00/730.00*100=31.51

1、首选discountAmount是计算减出来,orderAmount是从数据库取得,不能理解为什么  orderAmount的precision 跟 discountAmount的不一样?!

2、这计算结果差别也太大了吧?!

3、自己在main方法里试了一下

System.out.println(new BigDecimal(230).setScale(2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).divide(new BigDecimal(730).setScale(2,BigDecimal.ROUND_HALF_UP),2,BigDecimal.ROUND_HALF_UP));

230*100/730=31.51,没毛病,Debug了一下

230   precision=0   scale=2
730   precision=0   scale=2

谁能解释一下这三个问题?

所有回答列表(1)
abcadmin123的gravatar头像
abcadmin123 LV18月23日

虽然你使用的是BigDecimal类型,但是使用的是它带浮点型参数的构造方法,在进行计算时会有精度丢失的情况存在,建议使用带字符串参数的构造方法,这样结果就唯一了

最近浏览
LikL9420 LV11昨天
月亮月亮星星星星星星
辉宇哥哥 LV2前天
星星星星
元数据前天
暂无贡献等级
a1525723924 LV29月18日
星星星星
Magic丶M LV59月18日
月亮星星
503382513 LV59月17日
月亮星星
我是沫沫儿 LV49月15日
月亮
youwuzuichen LV79月14日
月亮星星星星星星
fengzhou888 LV29月12日
星星星星
123456nty LV239月11日
太阳月亮星星星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友