Class MathUtils
- java.lang.Object
-
- org.apache.velocity.runtime.parser.node.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 anInteger
-Object with the value 11
add ( new Long(10), new Integer(1))
will return anLong
-Object with the value 11
add ( new Integer(10), new Float(1))
will return anFloat
-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 calladd (new Integer (Integer.MAX_VALUE), 1)
aLong
-object will be returned with the correct value ofInteger.MAX_VALUE+1
.
In addition to that the methodsmultiply
,add
andsubstract
implement overflow checks forlong
-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 0protected static java.util.Map
ints
TheClass
-object is key, the maximum-value is the valueprotected static java.util.List
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.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
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 BigDecimalstatic java.math.BigInteger
toBigInteger(java.lang.Number n)
Convert the given Number to a BigIntegerstatic 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.
-
-
-
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
-
BASE_FLOAT
protected static final int BASE_FLOAT
- See Also:
- Constant Field Values
-
BASE_DOUBLE
protected static final int BASE_DOUBLE
- See Also:
- Constant Field Values
-
BASE_BIGINTEGER
protected static final int BASE_BIGINTEGER
- See Also:
- Constant Field Values
-
BASE_BIGDECIMAL
protected static final int BASE_BIGDECIMAL
- See Also:
- Constant Field Values
-
ints
protected static final java.util.Map ints
TheClass
-object is key, the maximum-value is the value
-
typesBySize
protected static final java.util.List typesBySize
The "size" of the number-types - ascending.
-
-
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 sizeop1
- first operand of binary operationop2
- 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 operationop2
- second operand of binary operation- 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.
-
-