一、问题描述
上周四研发使用EDI的数据转换时发现el表达式计算结果不正确,即使用el表达式进行除法的时候结果不对。例如:${numVar/1000},其中通过日志里观察numVar的变量值为2,但是结果确实0.
二、定位
- 在数据转换模块增加测试用例,发现结果正常为0.002。
- 推测numVar类型不对,通过观察流程发现该值是从数据库里读出来的。
- 通过远程断点发现该值类型为BigDecimal类型,经测试发现如果numVar是Decimal类型,其运算结果就是0.
三、源码分析
public class NumberOperations {
public static final Number div(TypeConverter converter, Object o1, Object o2) {
if (o1 == null && o2 == null) {
return LONG_ZERO;
}
if (isBigDecimalOrBigInteger(o1) || isBigDecimalOrBigInteger(o2)) {
return converter.convert(o1, BigDecimal.class).divide(converter.convert(o2, BigDecimal.class), BigDecimal.ROUND_HALF_UP);
}
return converter.convert(o1, Double.class) / converter.convert(o2, Double.class);
}
}
el计算时如果发现除数和被除数有一个BigDecimal时,就会执行converter.convert(o1, BigDecimal.class).divide(converter.convert(o2, BigDecimal.class), BigDecimal.ROUND_HALF_UP)
。即执行除法后四舍五入取整。
四、解决方案
${numVar / 1000}
改为${numVar.doubleValue() / 1000}
网友评论