订单系统除法精度缺失问题

在一个订单系统中,需要限制下单数量不能超过库存的百分比,比如一个商品库存是20吨,在配置单次不能大于库存的30%,解题思路是下单数/库存总数与配置做对比。但是除法运算可能会出现除不尽的情况,比如1/3= 0.3333333.....,对于除法需要保留小数点后的数字。 当时我在计算的时候保留了两位小数,

  • 使用 (5.99/20 = 0.29) < 0.3,可以成功。
  • 使用 (6.01/20 = 0.30)= 0.3,这就有问题了。

问题原因

因为涉及到保留小数,6.01/20 = 0.3005,就转成了 0.30,所以就判断错误了。

解决方案一:小数位保留4位小数

如果和两位小数的做对比,相除的结果需要保留两倍的小数,也就是四位小数。

解决方案二: 改成乘法运算。

方案一不足在于,需要根据对比数的小数点更新保留的小数位数,不是很通用。我们需要将除法改成乘法,因为程序不会涉及小数保留, 再回到订单系统的计算,库存是20吨,下单限制不能大于30%,所以每次下单数量不能大于 20 * 30% = 6,再将下单数和 6 比较即可。

总结

  • 除法需要保留精度,就会存在精度缺失,所以需要多保留几位小数。
  • 除法可以转成乘法,使用乘法后的结果做对比即可。
  • 如果觉得文章对你有帮助的话,请点个赞吧!*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值