電商平台之運費分攤算法


下單的過程中我們會根據配送方式的不同來計算相應的運費,並將每個商品分攤到的運費金額放到訂單的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);
}
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM