订单系统除法精度缺失问题
在一个订单系统中,需要限制下单数量不能超过库存的百分比,比如一个商品库存是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 比较即可。
总结
- 除法需要保留精度,就会存在精度缺失,所以需要多保留几位小数。
- 除法可以转成乘法,使用乘法后的结果做对比即可。
如果觉得文章对你有帮助的话,请点个推荐吧!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?