Java|Java发红包案例( 二 )


this.setMoney(leftmoney-totalMoney);
//发红包拆分成count份数每份的金额不定
//红包不一定是整数如果有人非要发带小数的红包那么我们将小数位分离出来.
double decimalPart = totalMoney - (int)totalMoney;
//单独分理出小数就可以直接处理整数部分了.赋给变量moneyInt
int moneyInt = (int)(totalMoney);
Random ra = new Random();
double temp=0sumNum=0;
/*步骤2. 将总金额分成N个红包那我们先包好N-1个红包
每个红包随机赋予(0MoneyInt)之间的值*/
for (int i = 0; i < count; i++) {
temp = (double)ra.nextInt(moneyInt);
arrayList.add(temp);
sumNum+=temp;

/* * 步骤3. 然后用金额上限/红包总额 得到一个系数.*/
double xishu  = moneyInt/sumNum;
/*定义与系数运算后的接受变量numAfter/sumAfter */
double numAfter=0sumAfter=0;
for (int i = 0; i < count-1; i++) {
/** 步骤4. 将每个红包的值 * 系数 = 每个红包的实际值*/
numAfter = arrayList.get(i)*xishu;
arrayList.set(inumAfter);
//将numAfter传递给BigDecimal类需要将浮点数转换成字符串
String str = numAfter+\"\";
BigDecimal decimal = new BigDecimal(str);
BigDecimal setScale1 = decimal.setScale(2BigDecimal.ROUND_HALF_UP);
//将decimal添加到BigDecimal类的集合中
araryBD.add(setScale1);
sumAfter+=numAfter;

//初始化最后一个红包的值为0
double finalNum =0;
/*步骤5. 最后一个红包的值 = 总的红包金额 - 红包1-红包2-红包3 + 步骤一拆分的余数;*/
finalNum = (double)moneyInt-sumAfter+decimalPart;
//  arrayList.set(count-1finalNum);
/*将最后一个红包的值转换为String类型的对象然后传递给BigDecimal
* 用过setScale();方法将结果保留两位小数采用ROUND_HALF_UP参数也就是所谓的四舍五入.
* */
String strFinal = finalNum+\"\";
BigDecimal decima2 = new BigDecimal(strFinal);
BigDecimal setScale2 = decima2.setScale(2BigDecimal.ROUND_HALF_UP);
/*将四舍五入后的结果添加到arrayBD中*/
araryBD.add(setScale2);
System.out.println(\" 使用BigDecimal\");
System.out.println(araryBD);
return araryBD;

//收红包方法
public void receiver(ArrayList<BigDecimal> list){
//从多个红包重随机抽取一个给自己
//随机获取一个集合当中的索引编号
int index = new Random().nextInt(list.size());
//将BigDecimal转换成deouble类型数据
double tempValue = https://mparticle.uc.cn/api/list.get(index).doubleValue();
System.out.printf(\"用户名为:[%s
的用户抢到了[%.2f
元!抢之前的余额为[%.2f
\"this.getName()tempValuethis.getMoney());
// System.out.printf(\"\\t\\t红包号为%d内容%.2f元!\\"++numCounttempValue);
//删除索引的元素
list.remove(index);
//当前成员自身有的钱
double money = getMoney();
//将得到的红包 + 自身当前
this.setMoney(money+tempValue);
System.out.printf(\"\\t抢之后的余额为[%.2f
\\"money+tempValue);

//构造方法
public Person() {

public Person(String name int money) {
this.name = name;
this.money = money;

//getter和setter方法
public String getName() {
return name;

public void setName(String name) {
this.name = name;

public double getMoney() {
return money;

public void setMoney(double money) {
this.money = money;


package HongBaoAnLi;
import java.math.BigDecimal;
import java.util.ArrayList;
/*
*//*
* 模拟拼手气红包:
* 对于指定总金额以及红包个数 , 可以生成不同金额的红包 ,
* , 每个红包金额随机生成 。