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

  • 相关阅读:
    dock 安装部署和初级管理命令
    3 gogs+jenkins 触发远程构建及tomcat管理war包替换
    2 gitlab+jenkins maven自动打包更新
    1 gitlab+jenkins 自动化部署 持续集成
    Day7 面向对象进阶
    Day 6 面向对象初级
    day4 迭代器&生成器&递归&json&正则
    day5 常用模块
    day3 函数
    day2 数据及文件操作
  • 原文地址:https://www.cnblogs.com/yelanggu/p/12976117.html
Copyright © 2011-2022 走看看