教你用java做個微信紅包,自己做運氣王!


java微信紅包

 微信是如今人們日常生活離不開的app,日常交流,小額轉賬,視頻通話等都很方便。

 

微信紅包也是人們使用得最多的功能,朋友一起出去吃個飯,飯后AA用微信紅包;逢年過節,給親朋好友發個紅包……

 

這篇文章教你用java做個紅包小項目!

注意事項

因為金額涉及到分,小數點后保留兩位,數值類型的轉換操作需要注意;

此中方案相對簡陋,並未實現每次紅包最大值在0.01-剩余紅包均值的2倍間;

/*

 * 紅包設計要求:

 * 1-紅包最小值為0.01,最大值為200

 * 2-紅包的金額面值為小數點后兩位

 * 3-避免單個紅包數值太大,通過系數設定

 * 4-紅包總量滿足金額數

 * */public class RedPacketUtil {

    //微信紅包的最大值和最小值,和最大紅包金額系數

    private static final float MINMUM = 0.01f;

    private static final float MAXMUM = 200.00f;

    private static final float TIMES = 2.1f;

    

    //判斷當前金額和數量是否正確

    public boolean isRight(float money,int count){

        //計算當前平均值

        float ave = (float)money / count;

        if(ave < MINMUM){

            return false;

        }else if(ave > MAXMUM){

            return false;

        }

        return true;

    }

    

    //生成每個具體紅包的金額

    public float redPacket(float money, float min, float maxs, int count) {

        //判斷當前人數

        if(count == 1){

            //確保紅包不小於0.01元

            money =  money > MINMUM ? money : MINMUM;

            return (float)(Math.round(money * 100)) / 100;

        }

        float max = maxs > money ? money : maxs;

        //生成單個紅包數量,且保證紅包的精度

        float one = (float) (Math.random()*(max - min) + min);

        one = (float)(Math.round(one * 100)) / 100; 

        

        float moneyRest = (money - one);

        

        //判斷當前紅包數量是否合理

        if(isRight(moneyRest,count - 1)){

            return one;

        }else{

            //重新分配紅包

            float ave = (float)moneyRest / (count-1);

            if(ave < MINMUM){

                return redPacket(money,min,one,count);

            }else if(ave > MAXMUM){

                return redPacket(money,one,max,count);

            }

        }

        return one;

    }

    

    //拆分紅包,生成具體的紅包數

    public List<Float> splitRedPacket(float money,int count){

        //判斷當前金額和數量是否正確

        if(!isRight(money,count)){

            return null;

        }

        //記錄每個紅包的數量

        List<Float> rpList = new ArrayList<Float>(); 

        //單個紅包的最大金額

        float max = (float)(money * TIMES)/ count ;

        max = max > MAXMUM ? MAXMUM : max;

        float one = 0;

        //開始記錄每個紅包的數量

        for(int i = 0;i < count;i++){

            one = redPacket(money,MINMUM,max,count-i);

            rpList.add(one);

            money = money - one;

        }

        return rpList; 

    }

    

    public static void main(String[] args) {

        RedPacketUtil util = new RedPacketUtil();

        List<Float> result = util.splitRedPacket(200, 10);

        System.out.println(result);

        //驗證金額總數

        float sum = 0;

        for(float i : result){

            sum = sum + i;

        }

        System.out.println(sum);

    }}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM