BigDecimal排除0
时间: 2024-08-16 12:00:15 浏览: 48
`BigDecimal` 类在 Java 中用于精确表示任意精度的十进制数,它内部处理数字时会考虑到小数点后的每一位,包括零。如果你想要创建一个 `BigDecimal` 对象并且希望排除其中的小数部分全部为零的情况,你可以直接构造时指定不包含零的部分。
例如:
```java
BigDecimal bd = new BigDecimal("123.45");
```
在这个例子中,字符串 "123.45" 将会被转换为一个 `BigDecimal` 对象,即使它实际上包含了小数点后的一个零(`.45`),但整体上并不算全零。
如果你想从一个字符串开始并移除所有小数点后的零,可以先转换成 `BigInteger` 然后再转换回 `BigDecimal`:
```java
String str = "123.000";
BigInteger bi = BigInteger.valueOf(str.replace(".", ""));
BigDecimal bdWithoutZeros = new BigDecimal(bi);
```
这里,`str.replace(".", "")` 会移除所有的点和其后的零。
相关问题
BigDecimal.devid排除0除数
您好!对于BigDecimal的除法操作,当除数为零时会抛出ArithmeticException异常。为了避免这种情况,可以在进行除法操作之前添加一些逻辑来判断除数是否为零。可以使用BigDecimal的compareTo方法来比较除数是否等于零,如果等于零则可以进行相应的处理,例如给出提示或者返回特定值。
以下是一个示例代码片段,演示如何在进行除法操作之前排除零除数的情况:
```java
BigDecimal dividend = new BigDecimal("10");
BigDecimal divisor = new BigDecimal("0");
if (divisor.compareTo(BigDecimal.ZERO) == 0) {
// 处理除数为零的情况
System.out.println("除数不能为零");
} else {
BigDecimal result = dividend.divide(divisor);
System.out.println("结果:" + result);
}
```
在这个示例中,我们首先使用compareTo方法将除数与BigDecimal.ZERO进行比较。如果结果等于零,则意味着除数为零。否则,我们可以继续进行除法操作,并打印出结果。
希望这个示例对您有帮助!如果您还有其他问题,请随时提问。
优化这段代码: if (divisibleBill.size() > 1 && !divisibleBill.isEmpty()) { // 2.1 取出子票金额,并求其总和 BigDecimal divisibleBillSum = divisibleBill.stream().map(IfbEcdsDrftInf::getIsseAmt).reduce(BigDecimal.ZERO, BigDecimal::add); // 2.2 拿出原票金额,若子票总金额等于原票金额,则进行后续判断 BigDecimal originalBillAmt = originalBill.get(0).getIsseAmt(); if (divisibleBillSum == originalBillAmt || divisibleBillSum.equals(originalBillAmt)) { String startRange = originalBill.get(0).getStartCdRange(); String endRange = originalBill.get(0).getEndCdRange(); // 2.3 查询电票信息表的母票,并更新状态 List<IfbEcdsDrftInf> originalEcdsBill = dao.selectAll(IfbEcdsDrftInf.class, Cnd.where("idNb", "=", idNb) .and(Cnd.where("startCdRange", "=", startRange)) .and(Cnd.where("endCdRange", "=", endRange))); IfbEcdsDrftInf ecdsDrft = originalEcdsBill.get(0); ecdsDrft.setDrftSndStat(ECDSConstants.DRAFT_STATUS_JSYJQ); ecdsDrft.setDrftRcvStat(ECDSConstants.DRAFT_STATUS_JSYJQ); ecdsDrft.setDrftCurrStat(ECDSConstants.DRAFT_STATUS_JSYJQ);// 结束已结清 dao.update(ecdsDrft); } }
这段代码的优化点比较多,我会一步步地进行优化:
1. 首先,判断 `divisibleBill` 是否为空的语句可以去掉,因为在判断其长度时,已经排除了其为空的情况。
2. 在计算 `divisibleBillSum` 时,可以使用 `BigDecimal` 提供的 `sum()` 方法,避免使用 `map()` 和 `reduce()` 的方式。
3. 在判断 `divisibleBillSum` 是否等于 `originalBillAmt` 时,可以使用 `compareTo()` 方法代替 `==` 和 `equals()`,因为在 `BigDecimal` 中,这两种比较方式会出现精度问题。
4. 在查询 `originalEcdsBill` 时,可以使用链式写法,避免重复的 `Cnd.where()` 方法。
5. 在更新 `ecdsDrft` 对象时,可以使用 `dao.update()` 方法的批量更新功能,避免每次更新只更新一个对象的情况。
优化后的代码如下:
```
if (divisibleBill.size() > 1) {
// 取出子票金额,并求其总和
BigDecimal divisibleBillSum = divisibleBill.stream().map(IfbEcdsDrftInf::getIsseAmt).sum();
// 拿出原票金额,若子票总金额等于原票金额,则进行后续判断
BigDecimal originalBillAmt = originalBill.get(0).getIsseAmt();
if (divisibleBillSum.compareTo(originalBillAmt) == 0) {
String startRange = originalBill.get(0).getStartCdRange();
String endRange = originalBill.get(0).getEndCdRange();
// 查询电票信息表的母票,并更新状态
List<IfbEcdsDrftInf> originalEcdsBill = dao.selectAll(IfbEcdsDrftInf.class,
Cnd.where("idNb", "=", idNb)
.and("startCdRange", "=", startRange)
.and("endCdRange", "=", endRange));
IfbEcdsDrftInf ecdsDrft = originalEcdsBill.get(0);
ecdsDrft.setDrftSndStat(ECDSConstants.DRAFT_STATUS_JSYJQ);
ecdsDrft.setDrftRcvStat(ECDSConstants.DRAFT_STATUS_JSYJQ);
ecdsDrft.setDrftCurrStat(ECDSConstants.DRAFT_STATUS_JSYJQ);// 结束已结清
dao.update(IfbEcdsDrftInf.class, Chain.make("drftSndStat", ECDSConstants.DRAFT_STATUS_JSYJQ)
.add("drftRcvStat", ECDSConstants.DRAFT_STATUS_JSYJQ)
.add("drftCurrStat", ECDSConstants.DRAFT_STATUS_JSYJQ),
Cnd.where("idNb", "=", idNb)
.and("startCdRange", "=", startRange)
.and("endCdRange", "=", endRange));
}
}
```