订单优惠金额均摊算法
场景
**订单**使用优惠金额**下放****订单明细**由于小数原因分配不完整
适用条件
商品精度至小数点后两位
示例
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<BigDecimal> list, BigDecimal couponMoney) {
//明细总和
BigDecimal