编程语言
首页 > 编程语言> > 电商平台之运费分摊算法

电商平台之运费分摊算法

作者:互联网

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

标签:BigDecimal,运费,item,finalFreight,分摊,电商,ROUND
来源: https://www.cnblogs.com/yelanggu/p/12976117.html