频道栏目
首页 > 微信学院 > 微信公众平台开发 > 正文

微信红包拆分,设置最大值和最小值

2015-10-28 08:40:15            作者:dangbingqu
收藏   我要投稿

一、需求描述

  红包有总金额,总份数,每次中奖的最小金额和最大金额

  举例:

  总金额:  3700元

  总份数:  1000份

  最小金额:  2元

  最大金额:  5元

二、需求分析

  为了保障最小金额,那么允许分配的金额 = 3700 - 1000*2 = 1700元。需要做的就是将1700元按照条件(红包范围[2,5])进行分配。

 

三、实现代码

  

public class HongBaoTest {

    private static BigDecimal total = new BigDecimal(3700);// 总金额
    private static BigDecimal leftMoney = new BigDecimal(1700);//可分配的金额
    private static BigDecimal min = new BigDecimal(2);// 最小
    private static BigDecimal max = new BigDecimal(5);// 最大
    private static int count = 1000;// 份数
    private static int leftCount = 1000;// 份数

    private static List xArr = new ArrayList();
    private static List yArr = new ArrayList();

    private static void genList() {
        // 为了测试图表展示用
        for (int i = 0; i < count; i++) {
            xArr.add(i);
            yArr.add(min);
        }
        int i = 0;
        while (leftMoney.compareTo(BigDecimal.ZERO) > 0) {
            // 取随机安全值
            BigDecimal safeAmount = leftMoney.divide(new BigDecimal(leftCount), 2, BigDecimal.ROUND_HALF_UP);
            BigDecimal tempAmount = new BigDecimal(new Random().nextDouble()).multiply(safeAmount)
                    .multiply(new BigDecimal(2)).setScale(2, BigDecimal.ROUND_HALF_UP);
            if (tempAmount.add(yArr.get(i)).compareTo(max) > 0) {
                tempAmount = max.subtract(min);
            }
            if(leftMoney.subtract(tempAmount).compareTo(BigDecimal.ZERO) <= 0){
                // 这里注意:剩余金额分配进去后,可能会超过max,所以判断一下
                if(leftMoney.add(yArr.get(i)).compareTo(max)>0){
                    tempAmount = max.subtract(min);
                    leftMoney = leftMoney.subtract(tempAmount);
                }else{
                    tempAmount = leftMoney;
                    leftMoney = BigDecimal.ZERO;
                }
            }else{
                leftMoney = leftMoney.subtract(tempAmount);
            }
            if (leftCount <= 1) {
                leftCount = count;
            }else{
                leftCount--;
            }
            yArr.set(i, yArr.get(i).add(tempAmount));
            i = (i+1) % count;
        }
    }

    public static void main(String[] args) {
        genList();
        
        BigDecimal tempTotal = BigDecimal.ZERO;
        for (int i = 0; i < yArr.size(); i++) {
            tempTotal = tempTotal.add(yArr.get(i));
        }
        System.out.println(yArr);
        System.out.println("总金额:" + tempTotal.doubleValue());
    }
}

四、效果展示

  测试红包分布,用echart直观的看一下吧,效果还满意吧。

  备注:在测试的时候,用debug模式,自己把数据的值贴到前端js里面吧。(line2.html,line2.js其他的是酱油)代码地址:微信红包拆分http://download.csdn.net/detail/dangbingqu/9216413

  \

 

五、小结

  1. 分配好的数组,存入数据库,抽奖的时候随机顺序取出(暂时存数据库吧,要不然放哪里?求帮助)。

   2. 一般都有最小值,微信里面的是0.01,如果不希望有最大值,把最大值的判断条件去掉就可以了 。

   3. 我写着也难受,谁有好的办法告诉我一下。

相关TAG标签 最大值 红包
上一篇:微信无法调起支付解决办法
下一篇:微信公众号第三方平台开发概况
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站