double zero = 0.00;BigDecimal b = BigDecimal.valueod(zero).setScale(2);和BigDecimal.ZERO的区别
时间: 2024-04-03 08:34:28 浏览: 137
在Java中,BigDecimal是用于精确计算的类。BigDecimal.ZERO是一个已经被初始化为0的BigDecimal对象。而在这个代码中,double zero = 0.00; 是一个基本数据类型的0.00, BigDecimal b = BigDecimal.valueOf(zero).setScale(2); 是将这个基本数据类型的0.00转换成BigDecimal类型,并设置其小数点后保留两位小数。
因此,BigDecimal.ZERO是一个已经被初始化的BigDecimal对象,而BigDecimal.valueOf(zero).setScale(2)则是将一个基本数据类型的0.00转换成BigDecimal对象,并设置其小数点后保留两位小数。
相关问题
StSoftwareEchoEntity stSoftwareEchoEntity = new StSoftwareEchoEntity(); //类型全部数量 List<StSoftwareEchoEntity> stSoftwareEchoEntityList4 = typeListMap.get(integer); //正确数量 List<StSoftwareEchoEntity> stSoftwareEchoEntityList3 = exactnessTypeListMap.get(integer); if (ToolUtil.isNotEmpty(stSoftwareEchoEntityList3)) { Double a = (double) stSoftwareEchoEntityList3.size() / (double) stSoftwareEchoEntityList4.size(); BigDecimal bigDecimal = new BigDecimal(a).setScale(2, BigDecimal.ROUND_DOWN); double newDouble = bigDecimal.doubleValue(); Double score = (newDouble * 100); BigDecimal bigDecimal1 = new BigDecimal(score).setScale(2, BigDecimal.ROUND_DOWN); stSoftwareEchoEntity.setUserId(aLong); stSoftwareEchoEntity.setQuestionTypeId(integer); stSoftwareEchoEntity.setProportion(bigDecimal1.doubleValue()); integerList.add(stSoftwareEchoEntity); userMap.put(Integer.valueOf(integer), bigDecimal1.doubleValue()); } else { userMap.put(Integer.valueOf(integer), 0.0); }
这段代码没有明确的问题描述,不过看起来是计算概率的代码,其中有几个可以优化的地方:
1. `if (ToolUtil.isNotEmpty(stSoftwareEchoEntityList3))` 中的判断可以改为 `if (!stSoftwareEchoEntityList3.isEmpty())`,这样可以简化代码。
2. 可以将 `(double) stSoftwareEchoEntityList3.size()` 和 `(double) stSoftwareEchoEntityList4.size()` 提取出来,避免在每次循环中重复计算。
3. 可以使用方法引用来简化代码,例如 `(double) stSoftwareEchoEntityList3.size()` 可以改为 `Double.valueOf(stSoftwareEchoEntityList3.size())`。
4. 可以将 `BigDecimal` 的 `setScale()` 方法的第二个参数改为 `RoundingMode.DOWN`,这样可以更清晰地表达代码的意图。
下面是优化后的代码:
```
StSoftwareEchoEntity stSoftwareEchoEntity = new StSoftwareEchoEntity();
List<StSoftwareEchoEntity> stSoftwareEchoEntityList4 = typeListMap.get(integer);
List<StSoftwareEchoEntity> stSoftwareEchoEntityList3 = exactnessTypeListMap.get(integer);
if (!stSoftwareEchoEntityList3.isEmpty()) {
double size3 = Double.valueOf(stSoftwareEchoEntityList3.size());
double size4 = Double.valueOf(stSoftwareEchoEntityList4.size());
double proportion = size3 / size4;
double score = proportion * 100;
stSoftwareEchoEntity.setUserId(aLong);
stSoftwareEchoEntity.setQuestionTypeId(integer);
stSoftwareEchoEntity.setProportion(BigDecimal.valueOf(score).setScale(2, RoundingMode.DOWN).doubleValue());
integerList.add(stSoftwareEchoEntity);
userMap.put(integer, stSoftwareEchoEntity.getProportion());
} else {
userMap.put(integer, 0.0);
}
```
这个优化后的代码简化了计算概率的过程,也减少了重复计算,提高了代码的可读性和性能。
if(result.doubleValue()==BigDecimal.ZERO.setScale(scale).doubleValue()){ return round2(value,scale+1); } 完整代码
这段代码是一个使用 BigDecimal 实现的四舍六入五成双的方法的一部分。下面是完整的代码:
```java
public static BigDecimal roundHalfEven(double value, int scale) {
BigDecimal result = new BigDecimal(value).setScale(scale, RoundingMode.HALF_EVEN);
if (result.doubleValue() == BigDecimal.ZERO.setScale(scale).doubleValue()) {
return round2(value, scale + 1);
}
return result;
}
private static BigDecimal round2(double value, int scale) {
return new BigDecimal(value).setScale(scale, RoundingMode.HALF_EVEN);
}
```
这个方法接受两个参数,第一个参数是要进行舍入的数值,第二个参数是要保留的小数位数。它首先创建一个 BigDecimal 对象来表示要进行舍入的数值,并使用 setScale 方法来指定精度和舍入规则。然后,它判断舍入后的值是否为零,如果是,则调用 round2 方法将原始的数值舍入到小数位数比原先增加一位的精度上;否则,直接返回舍入后的 BigDecimal 对象。
round2 方法也是一个使用 BigDecimal 实现的四舍六入五成双的方法,它的作用是将原始的数值舍入到指定的小数位数上。这个方法也会根据要舍入的数值是否为零来判断是否需要将原始的数值舍入到比要保留的小数位数多一位的精度上。
阅读全文