[ https://issues.apache.org/jira/browse/GROOVY-7636?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Thibault Kruse updated GROOVY-7636: ----------------------------------- Description: When implementing the java.lang.Number interface with a custom class, the groovy NumberMath class file's instanceof check do not find a math, and it defaults to IntegerMath. I believe the default should be BigDecimal for best-effort compatibility. Also when comparing BigDecimal to a true Float or Double, FloatingPointMath is used, not BigDecimalMath. to reproduce: {code} static class MyNumber extends Number { def n MyNumber(n) { this.n = n } int intValue(){n} long longValue(){n} float floatValue(){n} double doubleValue(){n} int hashCode(){-n} boolean equals(other) { if (other instanceof MyNumber) { return n==other.n} return false } String toString() {return Double.toString(floatValue())} } void testGetMathCustom() { //assert getMath(50.0G, Float.valueOf("1.0")) == BigDecimalMath.INSTANCE; //assert getMath(50G, Float.valueOf("1.0")) == BigDecimalMath.INSTANCE; MyNumber num = new MyNumber(42); assert getMath(num) == BigDecimalMath.INSTANCE; assert getMath(num, 25) == BigDecimalMath.INSTANCE; } {code} was: When implementing the java.lang.Number interface with a custom class, the groovy NumberMath class file's instanceof check do not find a math, and it defaults to IntegerMath. I believe the default should be BigDecimal for best-effort compatibility. Also when comparing BigDecimal to a true Float or Double, FloatingPointMath is used, not BigDecimalMath. to reproduce: {code} static class MyNumber extends Number { def n MyNumber(n) { this.n = n } int intValue(){n} long longValue(){n} float floatValue(){n} double doubleValue(){n} int hashCode(){-n} boolean equals(other) { if (other instanceof MyNumber) { return n==other.n} return false } String toString() {return Double.toString(floatValue())} } void testGetMathCustom() { assert getMath(50.0G, Float.valueOf("1.0")) == BigDecimalMath.INSTANCE; assert getMath(50G, Float.valueOf("1.0")) == BigDecimalMath.INSTANCE; MyNumber num = new MyNumber(42); assert getMath(num) == BigDecimalMath.INSTANCE; assert getMath(num, 25) == BigDecimalMath.INSTANCE; } {code} > NumberMath.getMath suboptimal choice for custom Numbers > ------------------------------------------------------- > > Key: GROOVY-7636 > URL: https://issues.apache.org/jira/browse/GROOVY-7636 > Project: Groovy > Issue Type: Bug > Components: groovy-jdk > Reporter: Thibault Kruse > Priority: Minor > > When implementing the java.lang.Number interface with a custom class, the > groovy NumberMath class file's instanceof check do not find a math, and it > defaults to IntegerMath. I believe the default should be BigDecimal for > best-effort compatibility. > Also when comparing BigDecimal to a true Float or Double, FloatingPointMath > is used, not BigDecimalMath. > to reproduce: > {code} > static class MyNumber extends Number { > def n > MyNumber(n) { > this.n = n > } > int intValue(){n} > long longValue(){n} > float floatValue(){n} > double doubleValue(){n} > int hashCode(){-n} > boolean equals(other) { > if (other instanceof MyNumber) { return n==other.n} > return false > } > String toString() {return Double.toString(floatValue())} > } > void testGetMathCustom() { > //assert getMath(50.0G, Float.valueOf("1.0")) == > BigDecimalMath.INSTANCE; > //assert getMath(50G, Float.valueOf("1.0")) == > BigDecimalMath.INSTANCE; > MyNumber num = new MyNumber(42); > assert getMath(num) == BigDecimalMath.INSTANCE; > assert getMath(num, 25) == BigDecimalMath.INSTANCE; > } > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)