fengzf的gravatar头像
fengzf 2020-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

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

所有回答列表(2)
abcadmin123的gravatar头像
abcadmin123  LV1 2020年8月23日

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

liupengfei的gravatar头像
liupengfei  LV7 2021年3月2日

数据计算的浮点数精度问题

最近浏览
全栈小白  LV34 2023年3月14日
80730176  LV7 2022年12月6日
zhos0212  LV19 2021年7月1日
wzp1017 2021年4月19日
暂无贡献等级
A_xiaobao  LV9 2021年4月6日
1573352592  LV6 2021年4月2日
梓嘉一心一意ZYPeng丶  LV5 2021年3月29日
是一个鸽子啊  LV17 2021年3月12日
liupengfei  LV7 2021年3月2日
ld2805644085  LV1 2021年2月27日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友