使用iReport 3.0.0时double转Double报错及Double值运算转换咨询
解决iReport 3.0.0中的类型转换与数学运算问题
一、double与Double类型转换报错的处理
在iReport 3.0.0里碰到double和Double类型转换报错,大多和自动拆箱/装箱的兼容性或者变量空值有关:
- 如果要把基本类型double包装成Double对象,别依赖Java 5+的自动装箱特性(旧版本iReport对这个支持不太稳定),显式创建对象更靠谱:
new Double(yourDoubleVariable) - 如果要把Double对象转成基本类型double,首先得确保变量不为null(不然会触发空指针异常),然后调用
doubleValue()方法:yourDoubleObject.doubleValue() - 额外检查下变量的初始化逻辑,别在没赋值的情况下就做类型转换,这是这类报错的常见诱因。
二、Double与BigDecimal的数学运算实现
你给出的运算表达式本身是能运行的,但有几个细节要注意,同时还有更安全的高精度方案:
方案1:沿用你的转换逻辑(注意风险)
你的表达式:
(($V{totGlosaFaturaHospitalar}.doubleValue()/$V{totFaturamentoEmpresas}.doubleValue())-1)
需要重点关注两个点:
- 确保
$V{totGlosaFaturaHospitalar}不为null:如果这个变量可能为空,先加非空判断,比如:$V{totGlosaFaturaHospitalar} != null ? (($V{totGlosaFaturaHospitalar}.doubleValue()/$V{totFaturamentoEmpresas}.doubleValue())-1) : 0.0 - 避免除零错误:
$V{totFaturamentoEmpresas}的数值不能为0,否则会抛出算术异常,建议补充判断:$V{totFaturamentoEmpresas}.doubleValue() != 0 ? (($V{totGlosaFaturaHospitalar}.doubleValue()/$V{totFaturamentoEmpresas}.doubleValue())-1) : 0.0
方案2:高精度运算(推荐,避免double精度丢失)
因为totFaturamentoEmpresas是BigDecimal,转成double会丢失精度(尤其是大数值或小数位数多的场景),更稳妥的方式是用BigDecimal的原生运算方法,最后再转成double:
$V{totGlosaFaturaHospitalar} != null && $V{totFaturamentoEmpresas}.compareTo(BigDecimal.ZERO) != 0 ? $V{totGlosaFaturaHospitalar}.subtract($V{totFaturamentoEmpresas}) .divide($V{totFaturamentoEmpresas}, 10, BigDecimal.ROUND_HALF_UP) .doubleValue() : 0.0
这里的10是保留的小数位数,ROUND_HALF_UP是四舍五入规则,你可以根据需求调整参数。
内容的提问来源于stack exchange,提问作者paulo.sobrinho
相关产品推荐
相关产品推荐

