Skip to content
拼手气
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;
    }