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);
    }
     

  • 相关阅读:
    用汇编的眼光看c++(之模板函数) 四
    从B树、B+树、B*树谈到R 树 四
    how to locate dll in native c++ world / dotnet world?
    GAC和sidebyside
    ARM VS Intel
    关于dotnet下的encoding
    synchronization objects for interprocess synchronization and multithreadiing
    [remote debug]WinDBG 技巧: 如何用WinDBG远程调试程序
    [tip]transparent bmp
    Review: functor / function object
  • 原文地址:https://www.cnblogs.com/yelanggu/p/12976117.html
Copyright © 2011-2022 走看看