You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Thibault Kruse (JIRA)" <ji...@apache.org> on 2015/10/19 15:36:05 UTC
[jira] [Created] (GROOVY-7636) NumberMath.getMath suboptimal choice
for floats and custom Numbers
Thibault Kruse created GROOVY-7636:
--------------------------------------
Summary: NumberMath.getMath suboptimal choice for floats and 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)