BigDecimal num3 = new BigDecimal("1000"); BigDecimal num4 = new BigDecimal("15000"); BigDecimal divide1 = num3.divide(num4);
时间: 2024-06-04 22:12:07 浏览: 106
This code will throw an ArithmeticException because dividing 1000 by 15000 will result in a value less than 1, and there are no exact representations of such values as BigDecimal.
To avoid this exception, you can specify the scale and rounding mode of the result using the divide method that takes two additional arguments:
BigDecimal num3 = new BigDecimal("1000");
BigDecimal num4 = new BigDecimal("15000");
BigDecimal divide1 = num3.divide(num4, 2, RoundingMode.HALF_UP);
This will divide 1000 by 15000 and round the result to 2 decimal places using the HALF_UP rounding mode. The result will be 0.07.
相关问题
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; }优化以上代码,要求我能控制2个红包的尾数为3
以下是优化后的代码,可以控制2个红包的尾数为3:
```
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.setScale(2, BigDecimal.ROUND_DOWN));
} else {
BigDecimal maxAmount = remainingAmount.divide(new BigDecimal(num - i), 2, BigDecimal.ROUND_DOWN)
.multiply(new BigDecimal("2"));
BigDecimal amount;
do {
amount = maxAmount.multiply(new BigDecimal(random.nextDouble() + 0.01))
.setScale(2, BigDecimal.ROUND_DOWN);
} while (i == num - 3 && amount.setScale(0, BigDecimal.ROUND_DOWN).intValue() % 10 != 3);
list.add(amount);
remainingAmount = remainingAmount.subtract(amount);
}
}
return list;
}
```
在原有代码的基础上,我们使用 do-while 循环来控制第 num-2 个和第 num-1 个红包的尾数为 3。具体实现是,当生成的金额的整数部分除以 10 的余数不为 3 时,继续循环生成金额,直到生成的金额的整数部分除以 10 的余数为 3 为止。注意,这里使用了 `setScale(0, BigDecimal.ROUND_DOWN)` 来获取金额的整数部分,并且使用了 `intValue()` 方法将 BigDecimal 转换为 int 类型。
public static void main(String[] args) { //初始化测试场景 BigDecimal[][] rrr = { {new BigDecimal("0.1"), new BigDecimal("10")}, {new BigDecimal("1"), new BigDecimal("10")}, {new BigDecimal("100"), new BigDecimal("10")}, {new BigDecimal("1000"), new BigDecimal("10")} }; BigDecimal min = new BigDecimal("0.01"); //测试个场景 for (BigDecimal[] decimals : rrr) { final BigDecimal amount = decimals[0]; final BigDecimal num = decimals[1]; System.out.println(amount + "元" + num + "个人抢======================================================="); test3(amount, min, num); } } private static void test3(BigDecimal amount,BigDecimal min ,BigDecimal num){ final Random random = new Random(); final int[] rand = new int[num.intValue()]; BigDecimal sum1 = BigDecimal.ZERO; BigDecimal redpeck ; int sum = 0; //num总人数 for (int i = 0; i < num.intValue(); i++) { rand[i] = random.nextInt(100); sum += rand[i]; } final BigDecimal bigDecimal = new BigDecimal(sum); BigDecimal remain = amount.subtract(min.multiply(num)); for (int i = 0; i < rand.length; i++) { if(i == num.intValue() -1){ redpeck = remain; }else{ redpeck = remain.multiply(new BigDecimal(rand[i])).divide(bigDecimal,2, RoundingMode.FLOOR); } if(remain.compareTo(redpeck) > 0){ remain = remain.subtract(redpeck); }else{ remain = BigDecimal.ZERO; } sum1= sum1.add(min.add(redpeck)); System.out.println("第"+(i+1)+"个人抢到红包金额为:"+min.add(redpeck)); } System.out.println("校验每个红包累计额度是否等于红包总额结果:"+(amount.compareTo(sum1)==0)); } }解释这段代码
这段代码是一个模拟红包抢购的功能。在 `main` 方法中,通过初始化了一个二维数组 `rrr`,其中每个元素包含两个 `BigDecimal` 类型的值,分别表示红包总金额和红包个数。然后使用 `test3` 方法对每个测试场景进行测试。
`test3` 方法中,首先使用随机数生成了一个长度为 `num.intValue()` 的整型数组 `rand`,并计算了数组中所有元素之和。接下来,根据红包总金额和红包个数计算出每个红包的剩余金额 `remain`。
然后,使用一个循环遍历整型数组 `rand`,计算每个人抢到的红包金额。如果是最后一个人抢红包,则将剩余金额全部分给他;否则,根据随机数和剩余金额的比例计算每个人抢到的金额,并更新剩余金额。最后,将每个人抢到的金额累加到 `sum1` 中,并输出每个人抢到的红包金额。
最后,校验所有红包的累计金额是否等于总金额,并输出结果。
阅读全文