Appearance
拼手气
java
public static List<BigDecimal> divideRedPackage(BigDecimal totalAmount, int totalPeopleNum) {
// 检查输入合法性
if (totalAmount.compareTo(BigDecimal.ZERO) <= 0 || totalPeopleNum <= 0) {
throw new IllegalArgumentException("总金额必须大于0且人数必须为正整数");
}
// 将金额单位转化为“分”(使用整数进行处理避免精度问题)
BigDecimal scale = new BigDecimal(100); // 假设金额为元,乘以100变为分
totalAmount = totalAmount.multiply(scale);
BigDecimal restAmount = totalAmount;
int restPeopleNum = totalPeopleNum;
List<BigDecimal> amountList = new ArrayList<>();
ThreadLocalRandom random = ThreadLocalRandom.current();
for (int i = 0; i < totalPeopleNum - 1; i++) {
// 计算最大可分配金额 (人均金额 * 2)
BigDecimal maxAmount = restAmount.divide(new BigDecimal(restPeopleNum), RoundingMode.DOWN).multiply(new BigDecimal(2));
// 随机生成 1 到 maxAmount 之间的金额
BigDecimal amount = BigDecimal.valueOf(random.nextDouble(1, maxAmount.doubleValue()));
amount = amount.setScale(0, RoundingMode.DOWN); // 取整,去掉小数部分
restAmount = restAmount.subtract(amount); // 更新剩余金额
restPeopleNum--; // 更新剩余人数
amountList.add(amount);
}
// 最后一个人的金额为剩下的所有金额
amountList.add(restAmount.setScale(0, RoundingMode.DOWN));
// 将所有金额恢复到元单位(除以100)
return amountList.stream()
.map(amount -> amount.divide(scale, 2, RoundingMode.HALF_UP)) // 保留两位小数,四舍五入
.toList();
}普通
java
/**
* 平均分配金额的方法
*
* @param totalAmount 总金额
* @param totalPeopleNum 总人数
* @return 平均分配后的金额列表
*/
public static List<BigDecimal> averageDivide(BigDecimal totalAmount, int totalPeopleNum) {
// 检查输入合法性
if (totalAmount.compareTo(BigDecimal.ZERO) <= 0 || totalPeopleNum <= 0) {
throw new IllegalArgumentException("总金额必须大于0且人数必须为正整数");
}
// 计算每个人分到的金额(四舍五入保留2位小数)
BigDecimal averageAmount = totalAmount.divide(new BigDecimal(totalPeopleNum), 2, RoundingMode.DOWN);
// 计算剩余的金额
BigDecimal remainder = totalAmount.subtract(averageAmount.multiply(new BigDecimal(totalPeopleNum)));
List<BigDecimal> amountList = new ArrayList<>();
// 将平均金额分配给每个人
for (int i = 0; i < totalPeopleNum; i++) {
amountList.add(averageAmount);
}
// 将余数分配给前几个人,每人加 0.01 元,直到余数为 0
for (int i = 0; remainder.compareTo(BigDecimal.ZERO) > 0; i++) {
amountList.set(i, amountList.get(i).add(new BigDecimal("0.01")));
remainder = remainder.subtract(new BigDecimal("0.01"));
}
return amountList;
}