MathContextpublic final class MathContext extends Object implements SerializableImmutable 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:
- {@code precision}:
the number of digits to be used for an operation; results are
rounded to this precision
- {@code roundingMode}:
a {@link RoundingMode} object which specifies the algorithm to be
used for rounding.
|
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 | UNLIMITEDA {@code 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 | DECIMAL32A {@code 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 | DECIMAL64A {@code 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 | DECIMAL128A {@code 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 | precisionThe 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.
{@code precision} will always be non-negative. | final RoundingMode | roundingModeThe rounding algorithm to be used for an operation. | transient BigInteger | roundingMaxLookaside for the rounding points (the numbers which determine
whether the coefficient of a number will require rounding).
These will be present if {@code precision > 0} and
{@code precision <= MAX_LOOKASIDE}. In this case they will share the
{@code BigInteger int[]} array. Note that the transients
cannot be {@code 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 {@code MathContext} with the specified
precision and the {@link RoundingMode#HALF_UP HALF_UP} rounding
mode.
/* ----- Constructors ----- */
this(setPrecision, DEFAULT_ROUNDINGMODE);
return;
| public MathContext(int setPrecision, RoundingMode setRoundingMode)Constructs a new {@code MathContext} with a specified
precision and rounding mode.
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 {@code MathContext} from a string.
The string must be in the same format as that produced by the
{@link #toString} method.
An {@code IllegalArgumentException} is thrown if the precision
section of the string is out of range ({@code < 0}) or the string is
not in the format created by the {@link #toString} method.
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 boolean | equals(java.lang.Object x)Compares this {@code MathContext} with the specified
{@code Object} for equality.
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 int | getPrecision()Returns the {@code precision} setting.
This value is always non-negative.
return precision;
| public java.math.RoundingMode | getRoundingMode()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 roundingMode;
| public int | hashCode()Returns the hash code for this {@code MathContext}.
return this.precision + roundingMode.hashCode() * 59;
| private synchronized void | readObject(java.io.ObjectInputStream s)Reconstitute the {@code MathContext} instance from a stream (that is,
deserialize it).
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.String | toString()Returns the string representation of this {@code MathContext}.
The {@code String} returned represents the settings of the
{@code MathContext} object as two space-delimited words
(separated by a single space character, '\u0020',
and with no leading or trailing white space), as follows:
-
The string {@code "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.
-
The string {@code "roundingMode="}, immediately
followed by the value of the {@code 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
{@code toString} in the future if more properties are added to
this class.
return "precision=" + precision + " " +
"roundingMode=" + roundingMode.toString();
|
|