0
点赞
收藏
分享

微信扫一扫

java红包算法·返回List<Double>

陆公子521 2022-03-11 阅读 189


/*红包处理过程中出现0.00以后的尾数处理办法。

先获取List<Double>数据可由red(int number, double total, double min) 获取。

获取后用red_all_count(List<Double> red_all_count)可以获取总金额,进行一个对比,红包数少误差小,生成的红包数越多,误差可能越大。

*/

//测试

public static void main(String[] args) {

List<Double> ld=red(1000, 5000, 0.01);

red_all_count(ld);

}

/**

* @param red_all_count

* @return 总金额

*/

public static double red_all_count(List<Double> red_all_count){

double dou=0.0;

for (Double double1 : red_all_count) {

dou+=double1;

}

BigDecimal bg = new BigDecimal(dou);

   double d3 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

return d3;

}


/**

* @param 总份数:number


* @param 总金额:total


* @param 最小金额:min


* return doubleList


*/


public static List<Double> red(int number, double total, double min) {



// 红包数


// 红包总额


double money;


// 最小红包


double max;


int i = 1;


List<Double> list = new ArrayList<Double>();


if (number == 1) {


list.add(total);


return list;


}


DecimalFormat df = new DecimalFormat("###.##");


while (i < number) {


// 保证即使一个红包是最大的了,后面剩下的红包,每个红包也不会小于最小值


max = total - min * (number - i);


int k = (int) (number - i) / 2;


// 保证最后两个人拿的红包不超出剩余红包


if (number - i <= 2) {


k = number - i;


}


// 最大的红包限定的平均线上下


max = max / k;


// 保证每个红包大于最小值,又不会大于最大值


money = (int) (min * 100 + Math.random()


* (max * 100 - min * 100 + 1));


money = (float) money / 100;


// 保留两位小数


money = Double.parseDouble(df.format(money));


if(money<0.01){


money=DoubleUtil.changeDoubleTwo(min);


}


total = (int) (total * 100 - money * 100);


total = total / 100;


System.out.println("剩余金额:"+total+",本次生成红包:"+DoubleUtil.changeDoubleTwo(money));


list.add(money);


i++;


// 最后一个人拿走剩下的红包


if (i == number) {


list.add(total);

System.out.println("剩余金额:"+total+",本次生成红包:"+DoubleUtil.changeDoubleTwo(money));

}


}


// 取数组中最大的一个值的索引


return list;

}


举报

相关推荐

0 条评论