訂單優惠均攤演算法

2021-10-25 17:52:02 字數 1850 閱讀 5191

**訂單**使用優惠金額**下放****訂單明細**由於小數原因分配不完整
商品精度至小數點後兩位

1.商品原價1元

2.總共3件商品

3.合計金額3元

4.使用1張1元優惠券

5.金額等比分配到每一件商品

由於小數精度問題導致金額分配不完全
訂單總金額為				a

訂單明細金額為 b1,b2,b3....

a=b1+b2+...

訂單使用總優惠券金額為 c

訂單明細使用優惠券金額為 d1,d2,d3...

c=d1+d2...

正常演算法為

明細金額佔比為 b1/a

優惠券分攤金額為 d1=a*(b1/a)

帶入示例訂單金額

d1=(1/3)無限迴圈的小數導致訂單明細優惠金額與優惠金額有出入
d1=a*(b1/a)

d1 末位小數0舍1進

例如 0.11 ->0.12

0.10->0.10

d2=(c-d1)*(b2/(a-b1))

d2 末位小數0舍1進

依次類推...

/**

** @author: cy

* @description: 優惠金額分配演算法

* @date 2020-10-13

* @param list:明細金額集合

* @param couponmoney: 優惠金額

* @return: void

*/public

static

void

sf(list list, bigdecimal couponmoney)

for(bigdecimal onemoney : list)

//優惠券金額大於等於合計金額

if(couponmoney.

compareto

(sum)

>-1

)//舍0進1

//單個明細金額佔比

bigdecimal onemoneyscope = onemoney.

divide

(sum,

2, bigdecimal.

round_up);

//分配優惠券金額按比例 優惠金額末位舍0進1

lastmoney = onemoneyscope.

multiply

(couponmoney)

.setscale(2

, bigdecimal.

round_up);

//如果分配比例大於金額 則等於金額

if(lastmoney.

compareto

(onemoney)==1

) system.out.

println

(lastmoney)

;//優惠金額去除本次優惠金額

couponmoney = couponmoney.

subtract

(lastmoney)

;//總金額減去本次商品金額

sum = sum.

subtract

(onemoney);}

system.out.

println

("===>"

+json

.tojson

(list));

}

演算法複雜度分析 最好 最壞 平均 均攤

public int function int n,int x return sum 1.最壞時間複雜度當x n時,時間複雜度為o n 2.最壞時間複雜度 當x 1時,時間複雜度為o 1 3.平均時間複雜度 要查詢的變數 x 在陣列中的位置,有 n 1 種情況 在陣列的 0 n 1 位置中和不在陣列...

《哈利波特》買書最優惠演算法

書店針對 哈利波特 系列書籍進行 活動,一共5卷,用編號0 1 2 3 4表示,單獨一捲售價8元,具體折扣如下所示 本數 折扣 2 5 3 10 4 20 5 25 根據購買的卷數以及本數,會對應不同折扣規則情況。單數一本書只會對應乙個折扣規則,例如購買了兩本卷1,一本卷2,則可以享受5 的折扣,另...

演算法 電商訂單問題

描述 有一批電商訂單用陣列表示如下,order list i,j,k 其中,i,j為商品編號,k為商品編號對應的數量,n為商品類別總數。現設計乙個演算法,計算總訂單量。輸入 order list 0,2,5 3,4,6 2,4,7 n 6 輸出 final list 5,5,12,13,13,0,0...