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个人砍,就是上面这样了
文章来源: https://blog.csdn.net/hanling911/article/details/92640162