电商平台之运费分摊算法

下单的过程中我们会根据配送方式的不同来计算相应的运费,并将每个商品分摊到的运费金额放到订单的items表里,如果按照相应的比例进行分摊,就会存在四舍五入的小数分摊不均,比如10元运费3件商品,每个就会分摊到3.33,这样就会有0.01的误差存在,为了避免这样的误差存在,我们会记录下前几次分摊到的金额值总和,最后一个用总运费金额减去之前的总和,这样减避免了误差的存在。订单发生退货的时候就会根据退货数量不同来决定退还给用户多少金额。逻辑代码如下,假设订单总运费100元,所有商品的价格均取两位小数:

actualShippingFee:运费
goodsTotalAmount:商品总金额
for (int i = 0; i < orderItems.size(); i++) {

    OrderItem item = orderItems.get(i);

    //定义每次分摊后的总运费
    BigDecimal fareAmount = BigDecimal.ZERO;

    // 计算运费应该分摊的百分比:当前sku售价*购买数量 /商品总金额
    BigDecimal scale = item.getSettledPrice().multiply(new BigDecimal(item.getBuyerCount() + ""))
            .divide(goodsTotalAmount, 6, BigDecimal.ROUND_HALF_UP);

    //当前商品分摊到的运费
    fareAmount = actualShippingFee.multiply(scale);

    // 乘以数量再除以数量,保留两位小数,减少误差
    BigDecimal finalFreight = fareAmount.divide(new BigDecimal(item.getBuyerCount()), 2, BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(item.getBuyerCount())).setScale(2, BigDecimal.ROUND_HALF_DOWN);

    // 记录总分摊到的运费
    totalFareAmount = totalFareAmount.add(finalFreight);

    // 最后一次分摊到的运费 = 总运费-前(n-1)个商品分摊到的运费
    if (i == orderItems.size() - 1) {
        finalFreight = finalFreight.add(actualShippingFee.subtract(totalFareAmount).setScale(2, BigDecimal.ROUND_HALF_DOWN));
    }

    // 当前商品分摊到的最终运费
    item.setFare(finalFreight);
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值