[ https://issues.apache.org/jira/browse/PIG-5328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16329496#comment-16329496 ]
Michael Howard commented on PIG-5328: ------------------------------------- same problem ... use of of BigDecimal.ZERO.equals(BigDecimal) also exists in expressionOperators/POCast.java - lines 471 & 1434 data/DataType.java - line 665 {{$ find . -name \*.java | xargs grep --line-number ZERO\.equals\( | grep -i decimal}} {{./backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java:471: res.result = Boolean.valueOf(!BigDecimal.ZERO.equals((BigDecimal)res.result));}} {{./backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java:1434: result = Boolean.valueOf(!BigDecimal.ZERO.equals((BigDecimal)obj));}} {{./backend/hadoop/executionengine/physicalLayer/expressionOperators/Divide.java:113: return BigDecimal.ZERO.equals((BigDecimal) a);}} {{./data/DataType.java:665: return Boolean.valueOf(!BigDecimal.ZERO.equals(((BigDecimal) o)));}} {{$ }} > expressionOperator Divide.equalsZero(DataType.BIGDECIMAL) is invalid > -------------------------------------------------------------------- > > Key: PIG-5328 > URL: https://issues.apache.org/jira/browse/PIG-5328 > Project: Pig > Issue Type: Bug > Components: impl > Affects Versions: 0.16.0, 0.17.0 > Environment: pig source HEAD as of Jan 2018 ... probably goes all the > way back to initial implementation of BigDecimal support > Reporter: Michael Howard > Priority: Major > Original Estimate: 0.25h > Remaining Estimate: 0.25h > > Divide.equalsZero(DataType.BIGDECIMAL) is flawed in that it uses an invalid > test for == ZERO in the case of BigDecimal. > > ./physicalLayer/expressionOperators/Divide.java tests the divisor for zero in > order to avoid DivideByZero. > The test is performed using a method equalsZero(...) > Divide.equalsZero() is given 'protected' access, but I could not find other > references ... should be 'private' > equalsZero() implementation dispatches on dataType to type-specific > predicates ... the BigDecimal implementation is incorrect > The method BigDecimal.equals(other) is intended to be used for object > equality, not numerical equality. (Their justification is that equals() is > used in hash-table lookups in java Collections.) BigDecimal numbers are not > normalized and scale is an important attribute. Scale is included in > BigDecimal.equals(). The values "0" and "0.00" have different scales and are > not considered "equals()" > Comparisons for numeric equality need to be done using compareTo() > In the special case of comparing to zero, BigDecimal.signum() is the best. > The current code is > {{ case DataType.BIGDECIMAL:}} > {{ return BigDecimal.ZERO.equals((BigDecimal) a);}} > needs to be changed to > {{ case DataType.BIGDECIMAL:}} > {{ return ((BigDecimal) a).signum() == 0;}} > -- This message was sent by Atlassian JIRA (v7.6.3#76005)