一、实现思路
1、参考微信发红包,会有2个参数: 红包个数 和 红包金额 ,假设红包个数是num,红包金额是money ,使用随机数的方式进行划分,不考虑多线程情况下的并发情况, 一个简单的实现。
二、代码实现
1、红包代码如下
static Listhb(int num , double money){ //todo:省略红包个数、红包金额、单个红包最低 0.01的情况校验 ArrayList list = new ArrayList<>(); double sum = 0D ; // 记录已分配的红包金额 double amount = money ; //记录余额 while (num > 0){ num--; double v = 0 ; if(num != 0){ v = ThreadLocalRandom.current().nextDouble(0, amount); }else { // 最后一个红包 v = money -sum ; } BigDecimal decimal = BigDecimal.valueOf(v).setScale(2, RoundingMode.HALF_UP); double hb = decimal.doublevalue(); sum += hb; amount = money - sum; System.out.println(hb); list.add(hb); } System.out.println("sum:"+ sum); System.out.println("amount:"+ amount); return list ; }
2、测试:
public static void main(String[] args) { Listhb = hb(5, 10); System.out.println(hb); double v = hb.stream().collect(Collectors.summingDouble(x -> { return x; })).doublevalue(); System.out.println("合计金额:" +v); }
3、输出结果如下:
6.72 1.71 0.87 0.62 0.08 sum:9.999999999999998 amount:1.7763568394002505E-15 [6.72, 1.71, 0.87, 0.62, 0.08] 合计金额:10.0 Process finished with exit code 0
PS:以上,即是一个简单的发红包代码实现,还可以做更细的情况需考虑:
红包个数 校验 红包金额 金额校验 单个红包最低 0.01的情况校验 并发情况下的处理 ...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)