**訂單**使用優惠金額**下放****訂單明細**由於小數原因分配不完整
商品精度至小數點後兩位
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...