运用面向对象(异常,BigDecimal等知识)简单模拟一个微信抢红包的小程序

看题!

基于BigDecimal类实现微信红包算法的功能,比如设置红包总金额,然后设置需要生成的红包个数,
为每个红包随机指定金额,最低不能低于0.01元,要求:

  1. 每个红包金额随机指定
  2. 每个红包金额不能低于0.01元
  3. 要求每个红包的金额之和恰好等于总金额
  4. 如果平均每个红包的金额不足0.01元时抛出一个RedPacketException,提示每个红包金额不能少于0.01元
  • String total 总金额
  • int count 红包个数
  • return 返回生成的所有红包金额集合
  • author ZyKun.

上代码!

首先自定义一个异常

package com.redpacket.demo;

public class MyException extends Exception{

	public MyException() {
		// TODO Auto-generated constructor stub
	}
	public MyException(String s ) {
		super(s);
	}
}

定义一个红包类

package com.redpacket.demo;

import java.math.BigDecimal;

/**
基于BigDecimal类实现微信红包算法的功能,比如设置红包总金额,然后设置需要生成的红包个数,
为每个红包随机指定金额,最低不能低于0.01元,要求:

1. 每个红包金额随机指定
2. 每个红包金额不能低于0.01元
3. 要求每个红包的金额之和恰好等于总金额
4. 如果平均每个红包的金额不足0.01元时抛出一个RedPacketException,提示每个红包金额不能少于0.01元
* String total  总金额
* int    count  红包个数
* return 返回生成的所有红包金额集合
*
* author ZyKun.
*
*/

public class WeChatRedpacket {
	//红包金额
	private BigDecimal money;
	//红包id
	private int id ;
	
	public WeChatRedpacket() {
		// TODO Auto-generated constructor stub
	}

	public WeChatRedpacket(BigDecimal money, int id) {
		super();
		this.money = money;
		this.id = id;
	}

	public BigDecimal getMoney() {
		return money;
	}

	public void setMoney(BigDecimal money) {
		this.money = money;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return id+"号用户获得:"+money+"元";
	}
	

}

实现红包算法

package com.redpacket.demo;

import java.math.BigDecimal;
import java.text.Bidi;
import java.util.ArrayList;
import java.util.Random;


public class RedpacketMethod {
	//设置一个最小红包的金额
	static final BigDecimal Min = new BigDecimal("0.01");
	/**
	 * 
	 * @param total 总金额
	 * @param count 红包个数
	 * @return 返回生成所有红包金额集合
	 * @throws MyException 
	 */
	public static ArrayList<WeChatRedpacket> genRedPacket(double total,int count) throws MyException{
		//声明临时变量用于储存所有随机的红包对象
		ArrayList<WeChatRedpacket> packets = new ArrayList<WeChatRedpacket>();
		//计算每个红包最低金额一共需要多少钱
		double min = Min.multiply(new BigDecimal(count))
				.setScale(2,BigDecimal.ROUND_HALF_EVEN)
				.doubleValue();
		if(min>total) {
			//红包不够分配(最低0.01),抛出异常
			throw new MyException("每个红包不得低于0.01");
		}else if (min == total) {
			//红包恰好每个人只能够分配0.01元,则平均分配
			for(int i = 0; i<count; i++) {
				//创建红包对象
				WeChatRedpacket item = new WeChatRedpacket(new BigDecimal("0.01"),i+1);
				//将红包加入集合
				packets.add(item);
			}
		}else {
			//但红包大于每个人最少金额之和时,随机分配
			//将红包包装成Bigdecimal
			BigDecimal totalMoney = new BigDecimal(total);
			
			//先为每个人最低分配金额0.01元
			for(int i =0; i<count; i++) {
				packets.add(new WeChatRedpacket(new BigDecimal("0.01"),i+1));
			}
			//将总金额设置为原来基础上减去每个人最低分配金额
			totalMoney = totalMoney.subtract(new BigDecimal(min));
			
			//声明临时变量统计当前分配的金额总数 
			BigDecimal now = new BigDecimal(0);
			//获取每个红包的比例
			double [] arr = randomScle(count);
			//为前count-1个和那个包分配金额(避免精度丢失)
			for(int i = 0; i<count-1; i++) {
				//获取当前比例红包需要分配的金额
				BigDecimal item = totalMoney.multiply(new BigDecimal(arr [i]))
						.setScale(2,BigDecimal.ROUND_HALF_EVEN);
				//为没人在最低金额基础上加上随机比例金额
				packets.get(i).setMoney(packets.get(i).getMoney().add(item));
				//积累已分配的金额总数
				now = now.add(item);
				
			}
			//剩余的金额给最后一个
			//获取剩余的金额
			BigDecimal last = totalMoney.subtract(now);
			//设置最后一个红包的金额为原来基础上增加剩余的总金额
			packets.get(count-1).setMoney(packets.get(arr.length-1).getMoney().add(last).setScale(2,BigDecimal.ROUND_HALF_EVEN));
		}
		
		return packets;
		
	}
	/**
	 * 随机红包金额比例
	 * @param count 红包的分数
	 * @return 每份红包的比例数值
	 */
	private static double[] randomScle(int count) {
		//临时数组,储存所有红包的金额比例
		double [] arr = new double [count];
		Random r = new Random();
		double t = 0.0;
		for(int i = 0; i<count; i++) {
			//为数组中每一个元素设置一个1-100随机数
			arr[i] = r.nextInt(100)+1;
			//积累所加的所有随机数
			t+=arr[i];
		}
		//循环出每一个红包的比例
		for(int i =0; i<arr.length; i++) {
			arr[i] = arr[i] / t;
		}
		return arr;
		
	}
	public static void main(String[] args) throws MyException {
		ArrayList<WeChatRedpacket> list = genRedPacket(7, 7);
		BigDecimal t = new BigDecimal(0);
		for (WeChatRedpacket weChatRedpacket : list) {
			System.out.println(weChatRedpacket);
			t = t.add(weChatRedpacket.getMoney());
		}
		System.out.println(t);
	}
}


效果图:
在这里插入图片描述

ps:小白一枚,仅供参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值