FileDocCategorySizeDatePackage
MathContext.javaAPI DocJava SE 5 API11536Fri Aug 26 14:57:06 BST 2005java.math

MathContext

public final class MathContext extends Object implements Serializable
Immutable objects which encapsulate the context settings which describe certain rules for numerical operators, such as those implemented by the {@link BigDecimal} class.

The base-independent settings are:

  1. precision: the number of digits to be used for an operation; results are rounded to this precision
  2. roundingMode: a {@link RoundingMode} object which specifies the algorithm to be used for rounding.
see
BigDecimal
see
RoundingMode
author
Mike Cowlishaw
author
Joseph D. Darcy

Fields Summary
private static final int
DEFAULT_DIGITS
private static final RoundingMode
DEFAULT_ROUNDINGMODE
private static final int
MIN_DIGITS
private static final long
serialVersionUID
public static final MathContext
UNLIMITED
A MathContext object whose settings have the values required for unlimited precision arithmetic. The values of the settings are: precision=0 roundingMode=HALF_UP
public static final MathContext
DECIMAL32
A MathContext object with a precision setting matching the IEEE 754R Decimal32 format, 7 digits, and a rounding mode of {@link RoundingMode#HALF_EVEN HALF_EVEN}, the IEEE 754R default.
public static final MathContext
DECIMAL64
A MathContext object with a precision setting matching the IEEE 754R Decimal64 format, 16 digits, and a rounding mode of {@link RoundingMode#HALF_EVEN HALF_EVEN}, the IEEE 754R default.
public static final MathContext
DECIMAL128
A MathContext object with a precision setting matching the IEEE 754R Decimal128 format, 34 digits, and a rounding mode of {@link RoundingMode#HALF_EVEN HALF_EVEN}, the IEEE 754R default.
final int
precision
The number of digits to be used for an operation. A value of 0 indicates that unlimited precision (as many digits as are required) will be used. Note that leading zeros (in the coefficient of a number) are never significant.

precision will always be non-negative.

final RoundingMode
roundingMode
The rounding algorithm to be used for an operation.
transient BigInteger
roundingMax
Lookaside for the rounding points (the numbers which determine whether the coefficient of a number will require rounding). These will be present if precision>0 and precision<=MAX_LOOKASIDE. In this case they will share the BigInteger int[] array. Note that the transients cannot be final because they are reconstructed on deserialization.
transient BigInteger
roundingMin
private static final int
MAX_LOOKASIDE
Constructors Summary
public MathContext(int setPrecision)
Constructs a new MathContext with the specified precision and the {@link RoundingMode#HALF_UP HALF_UP} rounding mode.

param
setPrecision The non-negative int precision setting.
throws
IllegalArgumentException setPrecision parameter less than zero.


    /* ----- Constructors ----- */

                                               
       
        this(setPrecision, DEFAULT_ROUNDINGMODE);
        return;
    
public MathContext(int setPrecision, RoundingMode setRoundingMode)
Constructs a new MathContext with a specified precision and rounding mode.

param
setPrecision The non-negative int precision setting.
param
setRoundingMode The rounding mode to use.
throws
IllegalArgumentException setPrecision parameter less than zero.

        if (setPrecision < MIN_DIGITS)
            throw new IllegalArgumentException("Digits < 0");
        if (setRoundingMode == null)
            throw new NullPointerException("null RoundingMode");

        precision = setPrecision;
        if (precision > 0 && precision <= MAX_LOOKASIDE) {
            roundingMax = BigInteger.TEN.pow(precision);
            roundingMin = roundingMax.negate();
        }

        roundingMode = setRoundingMode;
        return;
    
public MathContext(String val)
Constructs a new MathContext from a string. The string must be in the same format as that produced by the {@link #toString} method.

An IllegalArgumentException is thrown if the precision section of the string is out of range (< 0) or the string is not in the format created by the {@link #toString} method.

param
val The string to be parsed
throws
IllegalArgumentException precision parameter out of range or incorrect format

        boolean bad = false;
        int setPrecision;
        if (val == null)
            throw new NullPointerException("null String");
        try { // any error here is a string format problem
            if (!val.startsWith("precision=")) throw new RuntimeException();
            int fence = val.indexOf(' ");    // could be -1
            int off = 10;                     // where value starts
            setPrecision = Integer.parseInt(val.substring(10, fence));

            if (!val.startsWith("roundingMode=", fence+1)) 
		throw new RuntimeException();
            off = fence + 1 + 13;
            String str = val.substring(off, val.length());
            roundingMode = RoundingMode.valueOf(str);
        } catch (RuntimeException re) {
            throw new IllegalArgumentException("bad string format");
        }

        if (setPrecision < MIN_DIGITS)
            throw new IllegalArgumentException("Digits < 0");
        // the other parameters cannot be invalid if we got here
        precision = setPrecision;
        if (precision > 0 && precision <= MAX_LOOKASIDE) {
            roundingMax = BigInteger.TEN.pow(precision);
            roundingMin = roundingMax.negate();
        }
    
Methods Summary
public booleanequals(java.lang.Object x)
Compares this MathContext with the specified Object for equality.

param
x Object to which this MathContext is to be compared.
return
true if and only if the specified Object is a MathContext object which has exactly the same settings as this object.

        MathContext mc;
        if (!(x instanceof MathContext))
            return false;
        mc = (MathContext) x;
        return mc.precision == this.precision
            && mc.roundingMode == this.roundingMode; // no need for .equals()
    
public intgetPrecision()
Returns the precision setting. This value is always non-negative.

return
an int which is the value of the precision setting

        return precision;
    
public java.math.RoundingModegetRoundingMode()
Returns the roundingMode setting. This will be one of {@link RoundingMode#CEILING}, {@link RoundingMode#DOWN}, {@link RoundingMode#FLOOR}, {@link RoundingMode#HALF_DOWN}, {@link RoundingMode#HALF_EVEN}, {@link RoundingMode#HALF_UP}, {@link RoundingMode#UNNECESSARY}, or {@link RoundingMode#UP}.

return
a RoundingMode object which is the value of the roundingMode setting

        return roundingMode;
    
public inthashCode()
Returns the hash code for this MathContext.

return
hash code for this MathContext

        return this.precision + roundingMode.hashCode() * 59;
    
private synchronized voidreadObject(java.io.ObjectInputStream s)
Reconstitute the MathContext instance from a stream (that is, deserialize it).

param
s the stream being read.

        s.defaultReadObject();     // read in all fields
        // validate possibly bad fields
        if (precision < MIN_DIGITS) {
            String message = "MathContext: invalid digits in stream";
            throw new java.io.StreamCorruptedException(message);
        }
        if (roundingMode == null) {
            String message = "MathContext: null roundingMode in stream";
            throw new java.io.StreamCorruptedException(message);
        }
        // Set the lookaside, if applicable
        if (precision <= MAX_LOOKASIDE) {
            roundingMax = BigInteger.TEN.pow(precision);
            roundingMin = roundingMax.negate();
        }
    
public java.lang.StringtoString()
Returns the string representation of this MathContext. The String returned represents the settings of the MathContext object as two space-delimited words (separated by a single space character, '\u0020', and with no leading or trailing white space), as follows:
  1. The string "precision=", immediately followed by the value of the precision setting as a numeric string as if generated by the {@link Integer#toString(int) Integer.toString} method.
  2. The string "roundingMode=", immediately followed by the value of the roundingMode setting as a word. This word will be the same as the name of the corresponding public constant in the {@link RoundingMode} enum.

For example:

precision=9 roundingMode=HALF_UP
Additional words may be appended to the result of toString in the future if more properties are added to this class.

return
a String representing the context settings.

        return "precision=" +		precision + " " +
	       "roundingMode=" +	roundingMode.toString();