BigDecimal的计算

时间:2014-04-21 20:50:48

标签: java jasper-reports arithmetic-expressions

我在解决这个问题时遇到了问题。我可以做加法,减法等... 但我想要做的就是这个((a - b)/ b)在Jasper的报告中。

这是我到目前为止所尝试的内容

${Budget}.subtract($F{Actual})/$F{Budget}

但是当我编译它时。它说我有表达问题。我正在使用Jasper Studio表达式编辑器

$ F {Budget}和$ F {Actual}都是文本字段,类java.math.BigDecimal

这是stace trace

net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
Source text : $F{Budgeted}.subtract($F{Actual}.divide($F{Budgeted}))

at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:475)

at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access$18(ReportControler.java:450)

at com.jaspersoft.studio.editor.preview.view.control.ReportControler$4.run(ReportControler.java:337)

at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

    Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
Source text : $F{Budgeted}.subtract($F{Actual}.divide($F{Budgeted}))

at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:308)

at net.sf.jasperreports.engine.fill.JRCalculator.evaluateEstimated(JRCalculator.java:582)

at net.sf.jasperreports.engine.fill.JRCalculator.estimateVariables(JRCalculator.java:181)

at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1261)

at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235)

at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1588)

at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:149)

at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:939)

at         net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFiller.run(BaseFillHandle.java:120)

at java.lang.Thread.run(Unknown Source)

   Caused by: java.lang.ArithmeticException: Division by zero

at java.math.BigDecimal.divide(Unknown Source)

at ProjectSummary_1398114778002_614232.evaluateEstimated(ProjectSummary_1398114778002_614232:405)

at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:295)

... 9 more

3 个答案:

答案 0 :(得分:2)

${Budget}.subtract($F{Actual})将返回BigDecimal引用,因此您不能使用除法符号/,因为这仅支持基元(以及取消装箱时的类包装)。因此,您应该使用BigDecimal#divide代替。

${Budget}.subtract($F{Actual}).divide($F{Budget})

从你的问题编辑:

  

引起:java.lang.ArithmeticException:除以零

您的$F{Budget}变量的值不应为零。您可以使用三元运算符来解决此问题:

${Budget}.subtract($F{Actual}).divide( ($F{Budget}.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : $F{Budget}) )

来自新评论:

  

如果$ F {Budget}为零,我需要将计算字段分配为零,并将其他数字指定为零。

只需修改三元运算符的用法:

($F{Budget} == null || $F{Budget}.compareTo(BigDecimal.ZERO) == 0)) ? BigDecimal.ZERO : $F{Budget}.subtract($F{Actual}).divide($F{Budget})

答案 1 :(得分:0)

你错过了一对()吗?

如果未指定关联,将导致表达式的歧义。 (编译器/分析器)

答案 2 :(得分:0)

查看堆栈跟踪。它有这条线。

Caused by: java.lang.ArithmeticException: Division by zero

所以$F{Budget}为零,只是你应该无法除以它。