对的起大家
package com.home.util;
import java.math.BigDecimal;
import java.util.Random;
public class RedPackageUtil {
/**
* 正式红包逻辑
* @param num
* @param money
* @return
*/
public String[] doMoney(int num ,double money ) {
String [] str= new String [num];
//已经通过代码,产生了多少钱
double havenmoney=0; double total=0;
for(int i=0;i<num;i++){
//通过计算器,获取随机钱
double random_=getRandomMoney(sub(money, havenmoney),num-i);
//剩余的钱
havenmoney=add(havenmoney, random_);
str[i]=""+random_; total=add(total,random_);
System.out.print("\t"+random_);
}
System.out.println(">>>>"+(""+money).equals(""+total)+"+>>>>>>"+money+"====="+total);
return str;
}
private double getRandomMoney(double remainmoney,int remainSize) {
// remainSize 剩余的红包数量
// remainMoney 剩余的钱
if (remainSize== 1) {
remainSize--;
return (double) Math.round(remainmoney * 100) / 100;
}
Random r = new Random();
double min = 0.01; //
double max = remainmoney / remainSize * 2;
double money = r.nextDouble() * max;
money = money <= min ? 0.01: money;
money = Math.floor(money * 100) / 100;
remainSize--;
remainmoney-= money;
return money;
}
/**
* 提供精确的加法运算。
*
* @param v1
* 被加数
* @param v2
* 加数
* @return 两个参数的和
*/
public double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 想减掉
* @param v1
* @param v2
* @return
*/
public double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
public static void main(String[] args) {
new RedPackageUtil().doMoney(5, 200);
new RedPackageUtil().doMoney(1, 20.2);
new RedPackageUtil().doMoney(5, 20.12);
new RedPackageUtil().doMoney(2, 20.5);
new RedPackageUtil().doMoney(5, 2);
new RedPackageUtil().doMoney(5, 0.22);
new RedPackageUtil().doMoney(1, 0.3);
new RedPackageUtil().doMoney(4, 5.2);
for(int j=0;j<20;j++){
new Thread(new Runnable() {
public void run() {
for(int i=0;i<3000;i++){
String cc=(""+System.currentTimeMillis()).substring((""+System.currentTimeMillis()).length()-1,(""+System.currentTimeMillis()).length());
int c=Integer.parseInt(cc)+1;
int cb=c*c+i+i;
new RedPackageUtil().doMoney((1+i%6), cb);
}
}
}).start();
}
}
}