BigDecimal.valueOf(laneVolumeTemp) .divide(BigDecimal.valueOf(totalVolume)).setScale(3, RoundingMode.HALF_UP).doubleValue()出现报错non-terminating decimal expans;no exact reprentable decimal result,如何修改
时间: 2023-12-14 15:39:10 浏览: 63
这个错误通常是因为小数位数过多导致的,可以尝试修改精度或者舍入模式来解决问题。
例如,您可以将setScale()方法的精度参数增加一些,例如改为4或5,这样可以保留更多的小数位数。另外,您也可以尝试使用RoundingMode.DOWN舍入模式,这样可以避免不可精确表示的小数出现。
在您的代码中,您可以尝试这样修改:
```
BigDecimal result = BigDecimal.valueOf(laneVolumeTemp)
.divide(BigDecimal.valueOf(totalVolume), 5, RoundingMode.DOWN);
double value = result.doubleValue();
```
这样,setScale()的精度参数改为5,同时使用RoundingMode.DOWN舍入模式,可以确保结果是一个可精确表示的小数。
相关问题
.divide(BigDecimal.valueOf(2), 0, RoundingMode.HALF_UP)改成保留两位小数
这个表达式看起来像是在使用某个库中的除法操作,其中参数`BigDecimal.valueOf(2)`代表除数,第二个参数`0`可能是被除数(如果它是`double`类型的话通常会被忽略,因为`divide`方法默认不提供被除数),而`RoundingMode.HALF_UP`表示四舍五入到最接近的整数。
如果你想要保留两位小数,你需要更改`RoundingMode`。`RoundingMode.HALF_UP`是向上取整(四舍五入),如果你想得到固定的两位小数结果,可以使用`RoundingMode.FLOOR`向下取整或者`RoundingMode.CEILING`向上取整,或者直接指定`RoundingMode.UNNECESSARY`,让`divide`方法自动处理精度。
所以,如果你希望保留两位小数,你可以这样做:
```java
BigDecimal result = divide(BigDecimal.valueOf(2), yourDividend, RoundingMode_HALF_DOWN); // 或者 RoundingMode_FLOOR或RoundingMode_CEILING,看你需要哪种策略
result = result.setScale(2, RoundingMode.HALF_UP); // 设置结果的小数位数为2,并四舍五入
```
BigDecimal initBigDecimal = new BigDecimal(1); BigDecimal residualvaluerate = assetstock.getResidualvaluerate();//预计净残值率 Long servicemonth = assetstock.getServicemonth(); //预计使用年限(月份) BigDecimal notaxamount = assetstock.getNotaxamount(); 固定资产原价 年折旧率=(1-预计净残值率)/预计使用年限×100% 月折旧率=年折旧率÷12 月折旧额=固定资产原价×月折旧率 使用java 代码 BigDecimal 用这些参数算出年折旧率、月折旧率、月折旧额
好的,根据您提供的参数,可以使用以下代码计算年折旧率、月折旧率和月折旧额:
```
BigDecimal residualvaluerate = assetstock.getResidualvaluerate();
Long servicemonth = assetstock.getServicemonth();
BigDecimal notaxamount = assetstock.getNotaxamount();
// 计算年折旧率
BigDecimal yearDepreciationRate = BigDecimal.ONE.subtract(residualvaluerate)
.divide(BigDecimal.valueOf(servicemonth), 4, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100));
// 计算月折旧率
BigDecimal monthDepreciationRate = yearDepreciationRate.divide(BigDecimal.valueOf(12), 4, RoundingMode.HALF_UP);
// 计算月折旧额
BigDecimal monthDepreciationAmount = notaxamount.multiply(monthDepreciationRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
```
其中,`BigDecimal.ONE` 表示 `1`,`divide` 表示除法运算,`multiply` 表示乘法运算,`setScale` 表示设置小数点保留位数,`RoundingMode.HALF_UP` 表示四舍五入。
阅读全文