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 21:24:40 浏览: 184
这段代码是一个模拟红包抢购的功能。在 `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` 的功能。
bigdecimal类型转String类型
### Java 中 BigDecimal 类型转换为 String 的方法
#### 使用 `toString()` 方法
`BigDecimal` 对象可以直接调用 `toString()` 方法来获取其字符串表示形式。然而,当数值较大时,此方法可能会返回带有科学计数法的形式。
```java
import java.math.BigDecimal;
public class Example {
public static void main(String[] args) {
BigDecimal bd = new BigDecimal("1234567890.123");
String str = bd.toString();
System.out.println(str);
}
}
```
这种方法简单直接,但对于大数可能不是最理想的显示方式[^2]。
#### 使用 `toPlainString()` 方法
为了防止出现科学记数法并获得更直观的十进制格式化输出,可以采用 `toPlainString()` 函数:
```java
import java.math.BigDecimal;
public class PlainExample {
public static void main(String[] args) {
BigDecimal bd = new BigDecimal("1E+11");
String plainStr = bd.toPlainString();
System.out.println(plainStr); // 输出:100000000000
}
}
```
这种方式能够确保即使对于非常大的数字也不会被简化成指数形式。
#### 使用 `toEngineeringString()` 方法
如果希望得到工程学上的标准表达——即每三位加一个小数点分隔符,则可以选择 `toEngineeringString()`:
```java
import java.math.BigDecimal;
public class EngineeringExample {
public static void main(String[] args) {
BigDecimal bd = new BigDecimal("1E+11");
String engStr = bd.toEngineeringString();
System.out.println(engStr); // 输出:100E+9 或者其他类似的工程表示
}
}
```
这种呈现风格特别适合某些特定应用场景下的数据展示需求.
阅读全文
相关推荐
















