public List<BigDecimal> divideRedPacket(BigDecimal totalAmount, int num) { List<BigDecimal> list = new ArrayList<>(); BigDecimal remainingAmount = totalAmount; Random random = new Random(); for (int i = 0; i < num; i++) { if (i == num - 1) { list.add(remainingAmount); } else { BigDecimal maxAmount = remainingAmount.divide(new BigDecimal(num - i), 2, BigDecimal.ROUND_DOWN) .multiply(new BigDecimal("2")); BigDecimal amount = maxAmount.multiply(new BigDecimal(random.nextDouble() + 0.01)) .setScale(2, BigDecimal.ROUND_DOWN); list.add(amount); remainingAmount = remainingAmount.subtract(amount); } } return list; }优化以上代码,要求添加两个参数,两个参数分别控制几个红包的位数为几
时间: 2024-03-22 14:38:07 浏览: 50
bigdecimal转integer.txt
以下是优化后的代码,添加了两个参数来控制几个红包的位数为几:
```
public List<BigDecimal> divideRedPacket(BigDecimal totalAmount, int num, int precision, int scale) {
List<BigDecimal> list = new ArrayList<>();
BigDecimal remainingAmount = totalAmount;
Random random = new Random();
for (int i = 0; i < num; i++) {
if (i == num - 1) {
list.add(remainingAmount.setScale(scale, BigDecimal.ROUND_DOWN));
} else {
BigDecimal maxAmount = remainingAmount.divide(new BigDecimal(num - i), scale, BigDecimal.ROUND_DOWN)
.multiply(new BigDecimal("2"));
BigDecimal amount;
do {
amount = maxAmount.multiply(new BigDecimal(random.nextDouble() + 0.01))
.setScale(scale, BigDecimal.ROUND_DOWN);
} while (i >= num - precision && amount.setScale(scale, BigDecimal.ROUND_DOWN).intValue() % 10 != scale);
list.add(amount);
remainingAmount = remainingAmount.subtract(amount);
}
}
return list;
}
```
在原有代码的基础上,我们添加了两个参数:precision 和 scale,分别用来控制几个红包的位数为几。在生成金额时,我们使用 `setScale(scale, BigDecimal.ROUND_DOWN)` 来保留指定的小数位数,并且使用 `intValue()` 方法将 BigDecimal 转换为 int 类型,以便于计算余数。在控制红包位数时,我们使用类似的方法,当生成的金额的整数部分除以 10 的余数不为 scale 时,继续循环生成金额,直到生成的金额的整数部分除以 10 的余数为 scale 为止。注意,这里使用了 `setScale(scale, BigDecimal.ROUND_DOWN)` 来获取金额的小数部分,并且使用了 `intValue()` 方法将 BigDecimal 转换为 int 类型。
阅读全文