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