导读:在交易、支付、清结算等场景中,经常会出现小数除不尽,或者小数相乘后位数太多的情况,这时需要对小数进行位数缩减处理
01
如果一笔订单优惠了10元,需要分摊到3个商品上,那么每个商品应该分摊多少呢?很明显,10除以3的结果是3.333...,是除不尽的。这时候,我们需要确定一个规则来决定每个商品最终分摊的优惠金额。假设有一笔收款100元,需要平均分账给7个人,每个人应该分多少钱呢?这里,100除以7的结果是14.2857143...,那么在实际操作中,我们该如何执行这个分账呢?比如,手续费率是0.38%,一笔收款是568元,那么应收的手续费就是568乘以0.38%,结果是2.158元。但是,如果我们需要保留两位小数,那么最终的手续费应该收多少呢?这个规则需要提前跟商户约定好。处理的大原则是“既不多付一分钱,也不少收一分钱,力求刚刚好”但是,当出现小数需要处理时,我们也是迫不得已。在这种情况下,我们要尽可能保证公平。如果实在做不到绝对公平,那么就要做到各方都能接受,达成共识。02
下面总结了7种常见的小数处理方法,以及它们适用的场景,所有方法均以保留2位小数为前提。在保留小数位数时,如果直接舍去多余位数,这种方法会使得结果值略偏小。这种方法适用于“不能高于”的限制场景,比如在进行多次分账时,为了确保不超过总分账金额,前面的分账可以采用直接去尾的方式,最后再进行适当调整。例如,568元乘以0.38%的手费率,计算结果是2.159元,去尾后即为2.15元。在银行给客户计算利息时,也可以考虑采用去尾法,这样从整体上来看,可以降低银行的资金成本。此外,我们在日常生活中购物时,也经常用到去尾法。比如买菜时,一共2.53元,我们可能会说“老板,零头别算了”,直接给2.5元就可以了。只要保留小数位数后有非零数值,就直接进一,这样结果会偏大一些。这种方法适用于“不低于”的限制场景,比如你给领导买可乐,一共有8个领导,每人需要一瓶;如果一箱只有6瓶可乐,那么8除以6的结果是1.3333...,在这种情况下,你只能买2箱(因为不能零卖)。举个例子,568元乘以0.38%的手续费率,计算结果是2.151元,按照有数则进一的原则,处理后结果为2.16元。这是最常见的处理方法,即“四舍五入法”,整体数值会略偏大。具体规则是:小数部分小于5时舍去,大于等于5时进一。微信的交易收款手续费就是采用的这种方法。举个例子,568元乘以0.38%的手续费率,计算结果是2.158元。因为8大于5,所以直接进一,最终结果为2.16元。该方法比“四舍五入”更精确,尤其在处理大量数据时,结果更接近真实数值。因为在1到9的数字中,5正好处于中间位置,如果采用四舍五入法,进一的场景会比舍去的场景多出一个“边界情况”。为了更公平,我们采用以5为分界线的处理方法:小于5时舍去,大于5时进一。而当等于5时,则根据具体情况处理。如果5后还有非零数值,则进一,例如2.12500009,因为5后还有数,所以进一,结果为2.13。如果5后没有数值了,我们需要看5前面的数是奇数还是偶数。奇数时舍5进1,偶数时舍5不进(0视为偶数)。例如:2.175中,5前面的“7”是奇数,所以舍5进1,结果为2.18;而2.165中,5前面的“6”是偶数,所以舍5不进,结果为2.16。当遇到除不尽的情况时,我们可以设定余数分配策略,先处理除尽的部分,最后再补全差额。这种方法可能会让个别分配存在微小误差,但整体上误差为零。以开头的分摊例子来说明:一笔订单优惠10元,需要分摊到3个商品上。10除以3除不尽,整数部分是3,余数是1。那么,可以先让2个商品各分摊3元,另一个商品分摊4元。如果需要保留2位小数,那么10除以3的结果是3.333333...。这时,可以让2个商品各分摊3.33元,最后一个商品分摊10减去前两个商品分摊的总额,即10-3.33-3.33=3.34元。这种方法适用于优惠分摊、分账以及退款手续费的处理。比如,微信的退款手续费规则中就采用了这种方法。余数分配方法还可以与其他方法联合使用,以确保最终的公平性。以微信多次退款时的手续费处理为例,前面几次退款可能按照“向下取整”的策略进行,而最后一次退款则退回全部剩余的手续费,这实际上就是对余数进行补齐的策略。虽然前面几次手续费可能少退了,但最后一次退款会全部补上,确保整体公平。采用“有数值则进1”的方法,虽然会使得单个数值偏大,但在最后一次处理时进行调整,可以确保整体无误差。例如,微信支付在规则调整前,对于部分退款的手续费采用的是“向上取整”的方式,这意味着在多次退款的情况下,前面返给商家的手续费可能会偏高。以2.12100009为例,按照“向上取整”的规则,结果会为2.13,这看起来和“进一法”的效果相似。但关键在于,通过在最后一次退款时进行相应的调整,可以确保整体手续费的准确性。与向上取整相反,直接舍去小数部分,这种方法与去尾法相似。目前,微信支付在多次退款的手续费退回处理中采用了“向下取整+余数补齐”的策略。微信支付在处理交易手续费时,采用了“四舍五入”的方法。以一笔收款568元为例,手续费率为0.38%,应收手续费为568*0.38%=2.158元,四舍五入后为2.16元。对于部分退款的情况,退款手续费的计算规则是:退款手续费=退款金额/总金额交易手续费。例如在实际工作中,可以根据实际业务情况灵活选择和组合这些处理方法,或者设计出更优的模型。例如,可以采用“平常向下取整,年终一次性补齐整体差额”等策略,以确保尽可能公平,并让大家都能接受。支付全链路爽文推荐
【入门】一文搞定“支付入门”
【入门】一文搞懂184个支付名词
【全局】88张图,把支付清结算串起来
【全局】1.9万字:支付清算生态
【交易】一文搞懂“交易核心”:交易、订单、账单、支付
【支付】3.5万字:一文搞懂“支付系统”
【清结算】万字:清结算,全局实现原理
【账务】3.5万字详解账务系统,从入门到精通
【线下】支付清结算全链路,2天线下集训营