为什么bd = bd.setScale(3, BigDecimal.ROUND_HALF_UP); bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);这两行代码对99.999处理的时候,输出的是100.0而不是100.00
时间: 2024-01-19 17:51:05 浏览: 84
这是因为在第一行代码中,你将BigDecimal对象bd的小数位数设置为3,并使用四舍五入模式进行舍入。此时,bd的值被舍入为了100.000。
在第二行代码中,你再次将BigDecimal对象bd的小数位数设置为2,并使用四舍五入模式进行舍入。但是,此时bd的值已经被舍入为100.000,且小数位数为3,因此再次舍入时只会保留两位小数,即变成了100.00。
如果要将99.999舍入为100.00,可以直接使用以下代码:
```
bd = bd.setScale(2, BigDecimal.ROUND_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 是一个枚举类型,可以提高代码的可读性。
BigDecimal movePoint = money.setScale(scale, BigDecimal.ROUND_HALF_UP).movePointRight(scale) 过时了 怎么替换
`BigDecimal movePoint = money.setScale(scale, BigDecimal.ROUND_HALF_UP).movePointRight(scale)` 这段代码在Java 8之后已经不再推荐使用,因为从Java 9开始,`RoundingMode`枚举类型及其相关的静态方法已经被标记为过时。如果你需要保留四舍五入的行为并右移小数点,可以按照以下方式替换:
```java
import java.math.BigDecimal;
import java.math.RoundingMode;
// ... (其他导入)
MoneyType money = ...; // 假设MoneyType是一个自定义类包含BigDecimal类型的字段
int scale = ...; // 小数位数
// 使用现代API
BigDecimal roundedMoney = money.setScale(scale, RoundingMode.HALF_UP);
BigDecimal movedMoney = roundedMoney.stripTrailingZeros(); // 移除多余的零
```
这里的`stripTrailingZeros()`方法会直接去除小数部分多余的零,然后得到新的`movedMoney`值。
阅读全文