首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

電商滿減優惠券分攤算法:按比例分配避免精度損失

     編輯:程式設計疑難解答

問題

訂單含多商品,使用滿減券(如減 100 元),需按商品價格比例分攤至各商品,高價商品多分攤,總和精確等於優惠金額,無分攤誤差。

標準算法:按比例分配 + 尾差修正

  1. 計算各商品分攤金額(保留 2 位小數):itemAmt = round(totalCoupon * itemPrice / totalPrice, 2)。
  2. 累加分攤金額得 sumAllocated。
  3. 計算尾差:diff = couponAmount - sumAllocated(可能為 ±0.01 等)。
  4. 將尾差加到最後一個商品或金額最大的商品上:lastItemAmt += diff。

代碼示例

List items = ...;
double totalPrice = items.stream().mapToDouble(i -> i.price).sum();
double coupon = 100.0;
double allocatedSum = 0;
for (int i = 0; i < items.size(); i++) {
    double amt = Math.round(coupon * items.get(i).price / totalPrice * 100) / 100.0;
    items.get(i).discount = amt;
    allocatedSum += amt;
    if (i == items.size() - 1) { // 最後一項吸收尾差
        items.get(i).discount += Math.round((coupon - allocatedSum) * 100) / 100.0;
    }
}

關鍵點

  • 使用 BigDecimal 替代 double 進行貨幣運算,避免浮點精度問題。
  • 尾差修正確保 Σ discount == coupon 精確成立。
  • 分攤規則需與財務、業務確認(按比例/按數量/均分)。

此法廣泛應用於電商訂單優惠分攤、分賬結算系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved