在财务结算时,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);
}

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 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年前 评论

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