avgSpeedList.forEach(v -> { BigDecimal avgSpeed1 = new BigDecimal(v.getAvgSpeed()).setScale(6, BigDecimal.ROUND_HALF_UP); v.setAvgSpeed(avgSpeed1.subtract(avgSpeed1).setScale(6, BigDecimal.ROUND_HALF_UP).floatValue()); }); 为什么最终结果为0.0
时间: 2024-04-02 22:32:59 浏览: 54
根据代码逻辑,该段代码对 `avgSpeedList` 中的每个元素执行以下操作:
1. 获取元素的 `avgSpeed` 属性值,并用 `setScale` 方法设置精度为 6 位小数(四舍五入);
2. 根据获取到的精度为 6 位小数的 `avgSpeed` 属性值,用 `subtract` 方法减去其自身,结果仍然是精度为 6 位小数的值;
3. 再次使用 `setScale` 方法设置精度为 6 位小数(四舍五入),并将其转换为 `float` 类型,最终赋值给元素的 `avgSpeed` 属性。
由于步骤 2 中减去自身,相当于计算出了 0,所以最终的结果都是 0.0。因此,无论 `avgSpeedList` 中的元素的 `avgSpeed` 属性值为多少,经过该段代码处理后都会变为 0.0。
相关问题
list.stream().forEach(e -> BigDecimal b1 = new BigDecimal(e.getWeight()); String weight = String.value0f(b1.multiply(new BigDecimal( val: 100)).setScale( newScale: 2, BiqDecimal.ROUND-HALF-UP)) e.setWeight(weight); return;能解释一下这段代码吗
这段代码使用了 Java 8 中的 Stream API 对一个列表进行操作。让我来逐步解释它的含义:
- `list.stream()` 将列表转换为一个流(Stream),以便进行后续的操作。
- `forEach(e -> ...)` 对流中的每个元素执行一系列操作,这里使用了 Lambda 表达式来定义操作。
- `BigDecimal b1 = new BigDecimal(e.getWeight())` 创建一个 BigDecimal 对象,将元素的 weight 属性值作为参数传入。
- `String weight = String.valueOf(b1.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP))` 执行数值计算操作。首先,将 b1 和 100 相乘得到一个新的 BigDecimal 对象,然后使用 `setScale()` 方法设置小数位数为 2,并指定使用 `ROUND_HALF_UP` 舍入模式。最后,使用 `String.valueOf()` 方法将结果转换为字符串类型。
- `e.setWeight(weight)` 将计算结果设置回元素的 weight 属性。
- `return` 结束当前元素的操作。
总体来说,这段代码的作用是对列表中的每个元素的 weight 属性进行数值计算,并将计算结果设置回元素的 weight 属性。具体计算逻辑是将 weight 属性值转换为 BigDecimal 对象,进行乘法运算并进行舍入,最后将结果转换为字符串并设置回原始对象。
list.forEach(p->{ BigDecimal occupiedNum = BigDecimal.ZERO; // 初始化累加变量 occupiedNumList.forEach(o->{ System.out.println(p.getProductId()+"======="+o.getProductId()); System.out.println(p.getProductId().equals(o.getProductId())); if(p.getProductId().equals(o.getProductId())){ occupiedNum.add(o.getNum()); } }); p.setOccupiedQty(occupiedNum); }); 累加为0
在这段代码中,想要计算每个商品所占用的数量,需要将已占用的数量累加起来。但是在你的代码中,使用了 BigDecimal 类型的对象 occupiedNum 来进行累加,但是在累加过程中却一直没有改变它的值,导致最终结果为0。
这是因为 BigDecimal 类型的对象是不可变的,也就是说,一旦创建了一个 BigDecimal 对象,它的值就不会再改变了。因此,在每次累加时,需要将累加后的结果重新赋值给 occupiedNum,才能保证结果正确。
修改后的代码如下:
```java
list.forEach(p -> {
BigDecimal occupiedNum = BigDecimal.ZERO; // 初始化累加变量
for (OccupiedNum o : occupiedNumList) {
System.out.println(p.getProductId() + "=======" + o.getProductId());
System.out.println(p.getProductId().equals(o.getProductId()));
if (p.getProductId().equals(o.getProductId())) {
occupiedNum = occupiedNum.add(o.getNum()); // 累加时重新赋值
}
}
p.setOccupiedQty(occupiedNum);
});
```
在这段代码中,使用了 for 循环来遍历已占用数量列表 occupiedNumList,并使用 occupiedNum.add(o.getNum()) 方法将累加后的结果重新赋值给 occupiedNum,保证了结果的正确性。
阅读全文