BigDecimal деление броска ArithmeticException: деление на ноль, даже когда я проверяю это - PullRequest
0 голосов
/ 07 ноября 2019

Привет, ребята, я сейчас работаю с talend и должен рассчитать некоторые KPI.

Я получаю ArithmeticException: Division by zero каждый раз, даже если я использую одну и ту же схему в разных вычислениях, и они работают безпроблемы.

(((functions_pattern.checkIfNull(opportunities1.tatsaechlicherumsatz)) == 
BigDecimal.ZERO) || ((functions_pattern.checkIfNull(rechnung1.netto)) == 
BigDecimal.ZERO))
 ?  BigDecimal.ZERO  
 : (rechnung1.netto.divide(opportunities1.tatsaechlicherumsatz , 
    java.math.MathContext.DECIMAL32))

functions_pattern.checkIfNull устанавливает значение null равным нулю (в данном случае BigDecimal.ZERO) Я также пробовал различные варианты этого (отдельная null проверка и т. д.)

Также, так как я работаю с talend, я должен использовать троичные операторы.

1 Ответ

1 голос
/ 07 ноября 2019

Использование == для проверки BigDecimal - плохая идея.

Даже если предположить, что checkIfNull возвращает Decimal.ZERO, когда null, у вас все еще есть проблема, с которой rechnung1.netto может столкнутьсябыл ноль, равный != Decimal.ZERO.

Кроме того, equals имеет проблему, состоящую в том, что и значение, и шкала должны быть равны, чтобы два BigDecimal значения считались равными.

Это безопасный способ проверить (ненулевое) BigDecimal значение на ноль:

 BigDecimal x = ...
 if (x.compareTo(BigDecimal.ZERO) == 0) {
     // it is zero
 } else {
     // it is not zero
 }
...