java红包算法·返回List<Double>
2017-11-04 13:16
351 查看
/*红包处理过程中出现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;
}
先获取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;
}
相关文章推荐
- java thrift返回List<String>异常
- Java中使用hql,sql查询返回的list<Object> 转成需要的实体对象--方法讲解!
- jni实现返回值为java类型的String[]和List<E>的函数
- scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name
- mybatis调用oracle存储过程返回游标 读取到java的List<Map>
- 扑克牌洗牌问题<用java写出算法:54张扑克,分成上下两等份有规律的洗牌,多少次可以返回初始值>
- scala返回List<Object>类型给java
- 在JavaScript中实现类似Java中List<Map>类型的数组
- java中集合排序,List<Map>,List<T>类型或者JSONObject的升序和降序排序
- 内功心法 -- java.util.LinkedList<E> (4)
- java List<String>的初始化
- java.util.LinkedList<E>中offer和add的区别
- 错误:Property of 'java.util.Set<?>' type cannot be injected by 'List'的解决方案
- How to convert List<Integer> to int[] in Java?
- java反射 获取 /List<实体> objData 泛型后的属性值
- java List<Item> its=new ArrayList<Item>(); Map按value中的某字段排序
- java中集合 list Map arraylist linkedlist hashmap ——学java,零基础不怕,不只要理论,更要实践+项目,<a href=http://www.bjweixin.com>太原维信科技提供 </a>
- Jfinal中DB返回List<Record>并将其按Record某字段分类,后转换为Map并返回前端
- Java点滴-List<Integer> list; 中尖括号的意思
- java中返回任意类型值( <V> V get(Object obj))