author:hann
(本文阅读预计5分钟)
一。前言:
最近公司项目引入了采购金返利活动,使用采购金和返还采购金同时开始,业务规则交错,所以每一笔钱的错位都会导致后续业务计算错误。
【保证精度与计算的正确性】,很重要。
二。碰到问题
开发时发现异常现象,在百分比计算返利时,有时候会多出1分钱问题,偶发。
原因1 : 因为在单订单多商品的每个商品乘法计算四舍五入,最后累加就会有出入。
原因2 : 由于业务形态为不一定所有商品参加返利,剔除逻辑与二维商品数组排序有关
三。解决方法
1. 计算最后一个商品使用减法,而非乘法,即:最后一个额度 = 总额 - 已计算额度,这样永远不会精度丢失超发或少发
2. php巧妙的二维数组按指定字段排序算法,array_multisort,两行代码搞定一个复杂排序逻辑
部分源码如下:
四.详细介绍
防止精度丢失其实就是一个运算理念,
这里着重介绍下php原装spl函数,以前小瞧它了
array_multisort();
$sort_purchase_rebate_price_arr = array_column($order_product_lists,'purchase_rebate_price');
array_multisort($sort_purchase_rebate_price_arr,SORT_ASC,$order_product_lists);
这个函数很强大,既可以计算一位数组的排序,也可以计算二维数组的排序
而且感觉百度百科介绍的比官方文档容易懂,另眼相看呀。
五.参考链接:
官方文档:https://php.net/manual/en/function.array-multisort.php
百度百科:https://baike.baidu.com/item/array_multisort/9038626?fr=aladdin