如何在iReport 3.0.0中对BigDecimal类型值求和与取平均值
解决iReport 3.0.0中BigDecimal类型的sum/avg运算报错问题
我之前在iReport 3.0.0里处理BigDecimal聚合运算时踩过一模一样的坑,给你几个亲测有效的解决思路:
检查变量的核心配置
确保用来做聚合的变量满足两个关键设置:- 变量的Value Class必须是
java.math.BigDecimal,不能是Double、Integer这类其他数值类型; - Calculation属性要对应设置成
Sum或者Average,同时Reset Type要匹配你的聚合范围(比如整个报表聚合选Report,分组聚合选对应分组名)。很多时候报错就是因为这里的类型不匹配或者重置范围不对。
- 变量的Value Class必须是
手动用Java表达式实现聚合(绕过内置函数bug)
iReport 3.0.0的内置sum/avg函数对BigDecimal的支持确实有缺陷,你可以手动维护聚合变量:- 创建求和变量
sumTotal:Value Class设为java.math.BigDecimal,Reset Type选Report,初始值表达式写new java.math.BigDecimal(0); - 在细节带的表达式里累加:
$V{sumTotal} = $V{sumTotal}.add($F{yourBigDecimalField})(这里要确保$F{yourBigDecimalField}确实是BigDecimal类型); - 计算平均值的话,额外加一个计数变量
itemCount(Value Class为java.lang.Integer,初始值0,每次细节带执行时+1),然后用表达式:$V{sumTotal}.divide(new java.math.BigDecimal($V{itemCount}), java.math.RoundingMode.HALF_UP)——一定要指定舍入模式,不然BigDecimal除法遇到除不尽的情况会直接报错。
- 创建求和变量
确保数据源字段的实际类型匹配
有时候你在iReport里把字段定义成BigDecimal,但数据源返回的可能是String、Double这类类型,导致隐式转换失败。可以在字段表达式里显式转换:new java.math.BigDecimal($F{rawDataField}.toString()),保证输入到聚合变量的是纯正的BigDecimal对象。处理空值避免报错
如果你的BigDecimal字段存在空值,聚合运算会直接抛出异常。可以在参与运算前先处理空值:$F{yourBigDecimalField} == null ? new java.math.BigDecimal(0) : $F{yourBigDecimalField},把空值替换为0后再进行sum/avg操作。
内容的提问来源于stack exchange,提问作者paulo.sobrinho
相关产品推荐
相关产品推荐

