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);
}}