el表达式与BigDecimal

一、问题描述

上周四研发使用EDI的数据转换时发现el表达式计算结果不正确,即使用el表达式进行除法的时候结果不对。例如:${numVar/1000},其中通过日志里观察numVar的变量值为2,但是结果确实0.

二、定位

  1. 在数据转换模块增加测试用例,发现结果正常为0.002。
  2. 推测numVar类型不对,通过观察流程发现该值是从数据库里读出来的。
  3. 通过远程断点发现该值类型为BigDecimal类型,经测试发现如果numVar是Decimal类型,其运算结果就是0.

三、源码分析

1
2
3
4
5
6
7
8
9
10
11
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}

评论