在财务结算时,10w+ 的单子出现了 2 毛 8 的误差,老哥们有没有办法缩小误差?

场景:目前有一个10w+的订单,然后公司平台抽取管理费。费率是6.0445%。最后财务结算时出现2毛8的误差

前提: 金额单位都是‘分‘, 管理费率存储的单位是百万分之一
管理费计算公式:

/**
 * 管理费算法
 * @param integer $managerRate 费率
 * @param integer $payMoney 输入金额
 * @return integer
 */
function managerFree($managerRate, $payMoney)
{
    //return bcdiv(bcmul($payMoney, $managerRate), floatval(1000000.0));
    return round(($payMoney * $managerRate) / 1000000);
}

上面两张方法都试过了。有没有这方面有经验的老哥哥。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7
TimJuly

是一笔订单出现2毛的误差还是多笔合计?

6年前 评论
994914376

使用bc函数计算看看

6年前 评论
TimJuly

@lishaoyong 你把总数和财务算出来的数发出来看看

6年前 评论

@TimJuly 目前找到了问题原因,是因为在保存费率字段的时候进行了四舍五入(费率是个除不尽的数)
举个栗子:
费率是6.5/93.5 计算结果是0.0695187165775401。但是入库的时候存储单位是百万分之一。所以就是0.0695187165775401 * 1000000 =69518.71657754011。进行四舍五入,最后的数据库记录结果是69519。这时候如果有个50w的订单。误差就会很明显。现在方案是。将6.5/93.5公式存入库。计算的时候直接用公式。这样误差就缩小了。达到了财务要求。不知道说没说明白。-。-

6年前 评论
TimJuly

@lishaoyong 嗯,原来费率也是计算出来的,我说咋一个常数能有那么大误差呢。

6年前 评论

@TimJuly 一开始我也蒙蔽。财务给我他的算法我才明白。财务是直接用公式的。哈哈

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!