我在iReport设计中将其定义为变量:
$V{total_ver}.intValue() != 0 ? new BigDecimal((new BigDecimal( $F{TotalVerified}+"").divide( new BigDecimal( $V{total_ver} +"") , 4, RoundingMode.HALF_DOWN )).multiply(new BigDecimal(100))+"") : new BigDecimal(0)
它应该显示90.91,但它显示100.0000。
我测试了Java程序中的等价物:
total_ver != 0 ? new BigDecimal((new BigDecimal( TotalVerified+"").divide( new BigDecimal( total_ver +"") , 4, RoundingMode.HALF_DOWN )).multiply(new BigDecimal(100))+"") : new BigDecimal(0)
并且它工作正常(显示90.91),那么为什么表达式无法在Jasper iReport中返回正确的值?
答案 0 :(得分:0)
似乎TotalVerified不是String,因此构造函数无法设置精度。如果它是双重的(应该避免)。当一个int时,精度为0位。
new BigDecimal((new BigDecimal( $F{TotalVerified}+"").setScale(2)
如果TotalVerified已经是一个带有“90.91”的字符串,则java版本可能有用。
答案 1 :(得分:0)
您的原始表达式非常复杂,可以像计算百分比一样简单。请改为尝试以下步骤:
将$F{TotalVerified}
和$V{total_ver}
的初始值表达式设置为:
new java.math.BigDecimal(0.0)
使用此表达式而不是您最初使用的表达式:
$V{total_ver}.intValue() != 0 ? $F{TotalVerified}.divide($V{total_ver}).multiply(100.0)
: new BigDecimal(0)