Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-7636

NumberMath.getMath suboptimal choice for custom Numbers

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • None
    • 2.5.0-alpha-1
    • groovy-jdk
    • None

    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:

        
          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;
          }
      

      Attachments

        Issue Links

          Activity

            People

              paulk Paul King
              tkruse Thibault Kruse
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: