zoukankan      html  css  js  c++  java
  • 电商平台之运费分摊算法

    下单的过程中我们会根据配送方式的不同来计算相应的运费,并将每个商品分摊到的运费金额放到订单的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);
    }
     

  • 相关阅读:
    技术面试之经验总结
    为何只有两篇文章?
    LOJ6364 烂柯
    mysql批量更新数据(性能优化)
    一个对象的key引发的血案
    总结与元素坐标相关的属性(再也搞不混了)
    利用nodejs搭建服务器,测试AJAX
    初探jquery之强大丰富的选择器
    Web前端开发规范手册
    IE8下标签float导致的bug。
  • 原文地址:https://www.cnblogs.com/yelanggu/p/12976117.html
Copyright © 2011-2022 走看看