java微信红包
微信是如今人们日常生活离不开的app,日常交流,小额转账,视频通话等都很方便。
- 红包设计要求:
- 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);}}
精彩评论