auditReportConfirmVO.setCutRatio(auditReportConfirmVO.getCutMoney().multiply(hundred).divide(auditReportConfirm.getSubmitMoney(), 2, BigDecimal.ROUND_HALF_UP));算术异常,帮我优化一下
时间: 2024-03-05 20:53:10 浏览: 163
这段代码可能会抛出 `java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.` 异常,主要是因为在进行除法操作时,可能会出现无限循环小数,而 `BigDecimal` 类默认的精度是 16 位,不足以表示无限循环小数,因此需要手动设置精度。
可以将这段代码修改为以下形式,使用 `BigDecimal` 的字符串构造函数设置精度:
```
BigDecimal cutRatio = auditReportConfirmVO.getCutMoney().multiply(hundred)
.divide(auditReportConfirm.getSubmitMoney(), 4, RoundingMode.HALF_UP);
auditReportConfirmVO.setCutRatio(cutRatio);
```
其中,第三个参数 `4` 表示精度为 4 位,第四个参数 `RoundingMode.HALF_UP` 表示四舍五入。你也可以根据实际需求,调整精度和舍入模式。
相关问题
BigDecimal maxInflowBandwidthRate = new BigDecimal(totalMaxInflowRate). divide(new BigDecimal(1000), 4, BigDecimal.ROUND_HALF_UP). divide(totalBandwidth, 2, BigDecimal.ROUND_HALF_UP). multiply(new BigDecimal("100")) .setScale(2, BigDecimal.ROUND_HALF_UP); 优化这段代码
这段代码可以进行如下优化:
```
BigDecimal totalMaxInflowRateDecimal = new BigDecimal(totalMaxInflowRate);
BigDecimal totalBandwidthDecimal = new BigDecimal(totalBandwidth);
BigDecimal maxInflowBandwidthRate = totalMaxInflowRateDecimal
.divide(new BigDecimal("1000"), 4, RoundingMode.HALF_UP)
.divide(totalBandwidthDecimal, 2, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100"))
.setScale(2, RoundingMode.HALF_UP);
```
在这里,我们首先将 totalMaxInflowRate 和 totalBandwidth 转换为 BigDecimal 类型的变量 totalMaxInflowRateDecimal 和 totalBandwidthDecimal,这样可以避免多次创建 BigDecimal 对象。
接着,我们将 new BigDecimal(1000) 替换为 new BigDecimal("1000"),这是因为使用字符串来创建 BigDecimal 对象可以避免一些精度问题。
最后,我们将 BigDecimal.ROUND_HALF_UP 替换为 RoundingMode.HALF_UP,这是因为 RoundingMode.HALF_UP 是一个枚举类型,可以提高代码的可读性。
fytgts.divide(zjwts, 0, BigDecimal.ROUND_CEILING).multiply(new BigDecimal("100"))
这段代码的作用是对两个 BigDecimal 类型的数值进行除法运算(fytgts 除以 zjwts),并将结果乘以 100,最终返回一个新的 BigDecimal 对象。其中,0 表示除法运算时保留的小数位数,BigDecimal.ROUND_CEILING 表示使用向正无穷方向舍入的方式进行舍入(即对结果向上取整)。
阅读全文