import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class NumUtils {
private static final BigDecimal TWO = new BigDecimal(2);
public static BigDecimal getNumsBelowNum(BigDecimal num){
return num.multiply(new BigDecimal(Math.random())).setScale(2,BigDecimal.ROUND_DOWN);
}
public static List<BigDecimal> find(int n , BigDecimal s){
List<BigDecimal> res = new ArrayList<>();
BigDecimal amounts = BigDecimal.ZERO;
for(int i = 0;i<n-1 ; i++){
BigDecimal amount = getNumsBelowNum((s.subtract(amounts)).divide(TWO).setScale(2,BigDecimal.ROUND_DOWN));
res.add(amount);
amounts = amounts.add(amount);
}
res.add(s.subtract(amounts).setScale(2,BigDecimal.ROUND_UP)); //这里得是round_up要不会有1分的问题
return res;
}
//测试一下
public static void main(String[] args) {
while (true){
List list = find(10,BigDecimal.valueOf(30)); //10个数字,和为30
System.out.println(list);
BigDecimal a = BigDecimal.ZERO;
for (int i = 0; i<list.size();i++){
a = a.add((BigDecimal)list.get(i));
}
System.out.println(a);
if(a.compareTo(BigDecimal.valueOf(30))!=0){
System.out.println("---------有异常数据拉!!");
}
}
}
}
适用于砍价,一次性把砍价的全部算出来,放List
30元,需要10个人砍,就是上面这样了