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)); } }解释这段代码
时间: 2024-04-15 22:24:40 浏览: 131
这段代码是一个模拟红包抢购的功能。在 `main` 方法中,通过初始化了一个二维数组 `rrr`,其中每个元素包含两个 `BigDecimal` 类型的值,分别表示红包总金额和红包个数。然后使用 `test3` 方法对每个测试场景进行测试。
`test3` 方法中,首先使用随机数生成了一个长度为 `num.intValue()` 的整型数组 `rand`,并计算了数组中所有元素之和。接下来,根据红包总金额和红包个数计算出每个红包的剩余金额 `remain`。
然后,使用一个循环遍历整型数组 `rand`,计算每个人抢到的红包金额。如果是最后一个人抢红包,则将剩余金额全部分给他;否则,根据随机数和剩余金额的比例计算每个人抢到的金额,并更新剩余金额。最后,将每个人抢到的金额累加到 `sum1` 中,并输出每个人抢到的红包金额。
最后,校验所有红包的累计金额是否等于总金额,并输出结果。
相关问题
用java bigdecimal实现 =IFERROR(((F2/E2*0.1+G2/E2*0.15+H2/E2*0.5-0.75)/9*100)*E2,0)
可以使用以下代码来实现:
```
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal f2 = new BigDecimal("100");
BigDecimal e2 = new BigDecimal("50");
BigDecimal g2 = new BigDecimal("200");
BigDecimal h2 = new BigDecimal("300");
BigDecimal result;
try {
result = (((f2.divide(e2, 10, BigDecimal.ROUND_HALF_UP)).multiply(new BigDecimal("0.1")))
.add((g2.divide(e2, 10, BigDecimal.ROUND_HALF_UP)).multiply(new BigDecimal("0.15")))
.add((h2.divide(e2, 10, BigDecimal.ROUND_HALF_UP)).multiply(new BigDecimal("0.5")))
.subtract(new BigDecimal("0.75")))
.divide(new BigDecimal("9"), 10, BigDecimal.ROUND_HALF_UP)
.multiply(e2)
.multiply(new BigDecimal("100"));
} catch (ArithmeticException e) {
result = new BigDecimal("0");
}
System.out.println(result);
}
}
```
其中,使用 `BigDecimal` 来进行精确计算,使用 `try-catch` 块来捕捉除数为零的异常,实现 `IFERROR` 的功能。
Java bigdecimal 转string
在Java中,将BigDecimal转换为String可以使用BigDecimal类的toString()方法。这个方法将BigDecimal对象转换为String类型的表示形式。
以下是一个示例代码:
```java
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal number = new BigDecimal("123.456");
String str = number.toString();
System.out.println(str);
}
}
```
在上面的示例中,我们创建了一个BigDecimal对象number,并将其初始化为123.456。然后,我们使用toString()方法将其转换为String类型的str,并打印输出。
请注意,toString()方法返回的是BigDecimal对象的准确表示形式,包括小数点后的所有位数。如果你想要对结果进行格式化,可以使用DecimalFormat类或String.format()方法。
阅读全文