Расчет BigDecimal

1

У меня проблема с этим расчетом. Я могу делать сложение, вычитать и т.д., Но я пытаюсь сделать это ((a-b)/b) в отчетах Jasper.

Вот что я пробовал до сих пор

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

но когда я его компилирую. В нем говорится, что у меня проблема с выражением. Я использую редактор выражений Jasper Studio

Оба $ F {Budget} и $ F {Actual} являются текстовыми полями и классом java.math.BigDecimal

Здесь трассировка трассы

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
Теги:
jasper-reports
arithmetic-expressions

3 ответа

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})
  • 0
    Я попробовал это так, и это дает мне ошибку при оценке выражения
  • 0
    Это правильный способ сделать это, но, возможно, у вас есть дополнительная ошибка. Можете ли вы дать точный текст вашей ошибки, пожалуйста, после применения этого исправления?
Показать ещё 11 комментариев
0

Посмотрите на свою трассировку стека. Он имеет эту линию.

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

Таким образом, $F{Budget} равен нулю, и это только право, что вы не можете разделить его.

0

Вам не хватает пары()?

Это создаст двусмысленность вашего выражения, если ассоциация не указана. (Компилятор/синтаксический анализ)

  • 0
    Пытался добавить (), по-прежнему выдавая ту же ошибку

Ещё вопросы

Сообщество Overcoder
Наверх
Меню