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 LV12020年8月23日

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

最近浏览
ld2805644085 LV1昨天
星星
洛水微寒但晚秋 LV11月11日
星星
清风徐来1024 LV21月9日
星星星星
白纸一长 LV31月8日
星星星星星星
dingjiaqiang LV42020年12月31日
月亮
java小书童 LV142020年12月28日
月亮月亮月亮星星星星
卞京伟 LV22020年12月22日
星星星星
gtlishujie LV72020年12月15日
月亮星星星星星星
另类清晨 LV42020年12月4日
月亮
xu1235550332020年11月22日
暂无贡献等级
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友