sjlevel
sjlevel

Reputation: 35

BigDecimal division throwing ArithmeticException: Division by zero even when i check against it

Hey guys I'm currently working with talend and have to calculate some KPI's.

I'm getting the ArithmeticException: Division by zero every time now even if I follow the same schema in different calculations and they work without problems.

(((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 sets a null value to zero (in this case BigDecimal.ZERO) I also tried various variations on this (separate null checking etc.)

Also since I'm working with talend I have to use ternary operators.

Upvotes: 1

Views: 2731

Answers (1)

Stephen C
Stephen C

Reputation: 718758

Using == to test a BigDecimal is a bad idea.

Even assuming that checkIfNull returns Decimal.ZERO when null, you still have the problem that rechnung1.netto could have been a zero that is != Decimal.ZERO.

Also equals has the problem that both the value and the scale must be equal for two BigDecimal values to be considered equal.

This is the safe way to test a (non-null) BigDecimal value for zero:

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

In some contexts, you could use equals rather than compareTo to avoid a specific null check:

 BigDecimal x = ...
 if (BigDecimal.ZERO.equals(x)) {  // "Yoda" condition.
     // it is zero
 } else {
     // it is not zero
 }

This relies on the Object.equals(Object) javadoc which says that a.equals(null) should return false if a is not null.

Upvotes: 3

Related Questions