【问题标题】:Calculation of BigDecimalBigDecimal 的计算
【发布时间】:2014-06-06 00:17:40
【问题描述】:

我在降低此计算时遇到了问题。我可以做加法,减法等... 但我正在尝试做的是 Jasper 报告中的 ((a - b)/b) 。

这是我目前尝试过的

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

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

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

这是stace的踪迹

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

【问题讨论】:

    标签: java jasper-reports arithmetic-expressions


    【解决方案1】:

    你是否缺少一对 ()?

    如果没有指定关联,这将导致您的表达不明确。 (编译器/解析器)

    【讨论】:

      【解决方案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})
      

      【讨论】:

      • 我试过这样,它给我错误评估表达式
      • 这是正确的做法,但也许你还有一个额外的错误。应用此修复程序后,您能否提供错误的确切文本?
      • @EricEvans 我不确定您是否真的同时拥有${Budget}$F{Budget},请查看您的代码。
      • @EricEvans 请不要编辑答案,而是发布带有相关信息的评论。
      • @gigz 堆栈跟踪告诉您错误的原因。似乎您的变量之一是Integer 类型,而您将其视为BigDecimal,因此它不起作用。
      【解决方案3】:

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

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

      所以$F{Budget} 为零,你不能除以它是正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-25
        • 2016-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多