Class MathUtils


  • public abstract class MathUtils
    extends java.lang.Object
    Utility-class for all arithmetic-operations.

    All operations (+ - / *) return a Number which type is the type of the bigger argument.
    Example:
    add ( new Integer(10), new Integer(1)) will return an Integer-Object with the value 11
    add ( new Long(10), new Integer(1)) will return an Long-Object with the value 11
    add ( new Integer(10), new Float(1)) will return an Float-Object with the value 11

    Overflow checking:
    For integral values (byte, short, int) there is an implicit overflow correction (the next "bigger" type will be returned). For example, if you call add (new Integer (Integer.MAX_VALUE), 1) a Long-object will be returned with the correct value of Integer.MAX_VALUE+1.
    In addition to that the methods multiply,add and substract implement overflow checks for long-values. That means that if an overflow occurs while working with long values a BigInteger will be returned.
    For all other operations and types (such as Float and Double) there is no overflow checking.
    Since:
    1.5
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected static int BASE_BIGDECIMAL  
      protected static int BASE_BIGINTEGER  
      protected static int BASE_DOUBLE  
      protected static int BASE_FLOAT  
      protected static int BASE_LONG
      The constants are used to determine in which context we have to calculate.
      protected static java.math.BigDecimal DECIMAL_ZERO
      A BigDecimal representing the number 0
      private static java.util.Map<java.lang.Class<? extends java.lang.Number>,​java.math.BigDecimal> ints
      The Class-object is key, the maximum-value is the value
      private static java.util.List<java.lang.Class<? extends java.lang.Number>> typesBySize
      The "size" of the number-types - ascending.
    • Constructor Summary

      Constructors 
      Constructor Description
      MathUtils()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static java.lang.Number add​(java.lang.Number op1, java.lang.Number op2)
      Add two numbers and return the correct value / type.
      static int compare​(java.lang.Number op1, java.lang.Number op2)
      Compare two numbers.
      static java.lang.Number divide​(java.lang.Number op1, java.lang.Number op2)
      Divide two numbers.
      static int findCalculationBase​(java.lang.Number op)
      Find the Number-type to be used for a single number
      private static int findCalculationBase​(java.lang.Number op1, java.lang.Number op2)
      Find the common Number-type to be used in calculations.
      static boolean isInteger​(java.lang.Number n)
      Test, whether the given object is an integer value (Byte, Short, Integer, Long, BigInteger)
      static boolean isZero​(java.lang.Number n)
      Compare the given Number to 0.
      static java.lang.Number modulo​(java.lang.Number op1, java.lang.Number op2)
      Modulo two numbers.
      static java.lang.Number multiply​(java.lang.Number op1, java.lang.Number op2)
      Multiply two numbers and return the correct value / type.
      static java.lang.Number negate​(java.lang.Number op)
      Negate a number
      static java.lang.Number subtract​(java.lang.Number op1, java.lang.Number op2)
      Subtract two numbers and return the correct value / type.
      static java.math.BigDecimal toBigDecimal​(java.lang.Number n)
      Convert the given Number to a BigDecimal
      static java.math.BigInteger toBigInteger​(java.lang.Number n)
      Convert the given Number to a BigInteger
      static java.lang.Number wrapPrimitive​(long value, java.lang.Class<?> type)
      Wrap the given primitive into the given class if the value is in the range of the destination type.
      private static java.lang.Number wrapPrimitive​(long value, java.lang.Number op1, java.lang.Number op2)
      Wrap the result in the object of the bigger type.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • DECIMAL_ZERO

        protected static final java.math.BigDecimal DECIMAL_ZERO
        A BigDecimal representing the number 0
      • BASE_LONG

        protected static final int BASE_LONG
        The constants are used to determine in which context we have to calculate.
        See Also:
        Constant Field Values
      • ints

        private static final java.util.Map<java.lang.Class<? extends java.lang.Number>,​java.math.BigDecimal> ints
        The Class-object is key, the maximum-value is the value
      • typesBySize

        private static final java.util.List<java.lang.Class<? extends java.lang.Number>> typesBySize
        The "size" of the number-types - ascending.
    • Constructor Detail

      • MathUtils

        public MathUtils()
    • Method Detail

      • toBigDecimal

        public static java.math.BigDecimal toBigDecimal​(java.lang.Number n)
        Convert the given Number to a BigDecimal
        Parameters:
        n -
        Returns:
        The number as BigDecimal
      • toBigInteger

        public static java.math.BigInteger toBigInteger​(java.lang.Number n)
        Convert the given Number to a BigInteger
        Parameters:
        n -
        Returns:
        The number as BigInteger
      • isZero

        public static boolean isZero​(java.lang.Number n)
        Compare the given Number to 0.
        Parameters:
        n -
        Returns:
        True if number is 0.
      • isInteger

        public static boolean isInteger​(java.lang.Number n)
        Test, whether the given object is an integer value (Byte, Short, Integer, Long, BigInteger)
        Parameters:
        n -
        Returns:
        True if n is an integer.
      • wrapPrimitive

        public static java.lang.Number wrapPrimitive​(long value,
                                                     java.lang.Class<?> type)
        Wrap the given primitive into the given class if the value is in the range of the destination type. If not the next bigger type will be chosen.
        Parameters:
        value -
        type -
        Returns:
        Number object representing the primitive.
      • wrapPrimitive

        private static java.lang.Number wrapPrimitive​(long value,
                                                      java.lang.Number op1,
                                                      java.lang.Number op2)
        Wrap the result in the object of the bigger type.
        Parameters:
        value - result of operation (as a long) - used to check size
        op1 - first operand of binary operation
        op2 - second operand of binary operation
        Returns:
        Number object of appropriate size to fit the value and operators
      • findCalculationBase

        private static int findCalculationBase​(java.lang.Number op1,
                                               java.lang.Number op2)
        Find the common Number-type to be used in calculations.
        Parameters:
        op1 - first operand of binary operation
        op2 - second operand of binary operation
        Returns:
        constant indicating type of Number to use in calculations
      • findCalculationBase

        public static int findCalculationBase​(java.lang.Number op)
        Find the Number-type to be used for a single number
        Parameters:
        op - operand
        Returns:
        constant indicating type of Number to use in calculations
      • add

        public static java.lang.Number add​(java.lang.Number op1,
                                           java.lang.Number op2)
        Add two numbers and return the correct value / type. Overflow detection is done for integer values (byte, short, int, long) only!
        Parameters:
        op1 -
        op2 -
        Returns:
        Addition result.
      • subtract

        public static java.lang.Number subtract​(java.lang.Number op1,
                                                java.lang.Number op2)
        Subtract two numbers and return the correct value / type. Overflow detection is done for integer values (byte, short, int, long) only!
        Parameters:
        op1 -
        op2 -
        Returns:
        Subtraction result.
      • multiply

        public static java.lang.Number multiply​(java.lang.Number op1,
                                                java.lang.Number op2)
        Multiply two numbers and return the correct value / type. Overflow detection is done for integer values (byte, short, int, long) only!
        Parameters:
        op1 -
        op2 -
        Returns:
        Multiplication result.
      • divide

        public static java.lang.Number divide​(java.lang.Number op1,
                                              java.lang.Number op2)
        Divide two numbers. The result will be returned as Integer-type if and only if both sides of the division operator are Integer-types. Otherwise a Float, Double, or BigDecimal will be returned.
        Parameters:
        op1 -
        op2 -
        Returns:
        Division result.
      • modulo

        public static java.lang.Number modulo​(java.lang.Number op1,
                                              java.lang.Number op2)
                                       throws java.lang.ArithmeticException
        Modulo two numbers.
        Parameters:
        op1 -
        op2 -
        Returns:
        Modulo result.
        Throws:
        java.lang.ArithmeticException - If at least one parameter is a BigDecimal
      • compare

        public static int compare​(java.lang.Number op1,
                                  java.lang.Number op2)
        Compare two numbers.
        Parameters:
        op1 -
        op2 -
        Returns:
        1 if n1 > n2, -1 if n1 < n2 and 0 if equal.
      • negate

        public static java.lang.Number negate​(java.lang.Number op)
        Negate a number
        Parameters:
        op - n
        Returns:
        -n (unary negation of n)