Source Code Cross Referenced for BigDecimal.java in  » JDK-Core » math » java » math » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Java Source Code / Java Documentation
1. JDK Core
2. JDK Modules
3. JDK Modules com.sun
4. JDK Modules com.sun.java
5. JDK Modules Platform
6. JDK Modules sun
7. Open Source Build
8. Open Source Graphic Library
9. Open Source IDE Eclipse
10. Open Source J2EE
11. Open Source JDBC Driver
12. Open Source Library
13. Open Source Library Database
14. Open Source Net
15. Open Source Script
16. Science
17. Security
18. Sevlet Container
19. SUN GlassFish
20. Swing Library
21. Web Services apache cxf 2.0.1
22. Web Services AXIS2
23. XML
Microsoft Office Word 2007 Tutorial
Java
Java Tutorial
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
C# / C Sharp
C# / CSharp Tutorial
ASP.Net
JavaScript DHTML
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
PHP
Python
SQL Server / T-SQL
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Java Source Code / Java Documentation » JDK Core » math » java.math 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


0001:        /*
0002:         * Portions Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
0003:         * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0004:         * 
0005:         * This code is free software; you can redistribute it and/or modify it
0006:         * under the terms of the GNU General Public License version 2 only, as
0007:         * published by the Free Software Foundation.  Sun designates this
0008:         * particular file as subject to the "Classpath" exception as provided
0009:         * by Sun in the LICENSE file that accompanied this code.
0010:         *  
0011:         * This code is distributed in the hope that it will be useful, but WITHOUT
0012:         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0013:         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
0014:         * version 2 for more details (a copy is included in the LICENSE file that
0015:         * accompanied this code).
0016:         *  
0017:         * You should have received a copy of the GNU General Public License version
0018:         * 2 along with this work; if not, write to the Free Software Foundation,
0019:         * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0020:         *  
0021:         * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0022:         * CA 95054 USA or visit www.sun.com if you need additional information or
0023:         * have any questions.
0024:         */
0025:
0026:        /*
0027:         * Portions Copyright IBM Corporation, 2001. All Rights Reserved.
0028:         */
0029:
0030:        package java.math;
0031:
0032:        /**
0033:         * Immutable, arbitrary-precision signed decimal numbers.  A
0034:         * {@code BigDecimal} consists of an arbitrary precision integer
0035:         * <i>unscaled value</i> and a 32-bit integer <i>scale</i>.  If zero
0036:         * or positive, the scale is the number of digits to the right of the
0037:         * decimal point.  If negative, the unscaled value of the number is
0038:         * multiplied by ten to the power of the negation of the scale.  The
0039:         * value of the number represented by the {@code BigDecimal} is
0040:         * therefore <tt>(unscaledValue &times; 10<sup>-scale</sup>)</tt>.
0041:         * 
0042:         * <p>The {@code BigDecimal} class provides operations for
0043:         * arithmetic, scale manipulation, rounding, comparison, hashing, and
0044:         * format conversion.  The {@link #toString} method provides a
0045:         * canonical representation of a {@code BigDecimal}.
0046:         * 
0047:         * <p>The {@code BigDecimal} class gives its user complete control
0048:         * over rounding behavior.  If no rounding mode is specified and the
0049:         * exact result cannot be represented, an exception is thrown;
0050:         * otherwise, calculations can be carried out to a chosen precision
0051:         * and rounding mode by supplying an appropriate {@link MathContext}
0052:         * object to the operation.  In either case, eight <em>rounding
0053:         * modes</em> are provided for the control of rounding.  Using the
0054:         * integer fields in this class (such as {@link #ROUND_HALF_UP}) to
0055:         * represent rounding mode is largely obsolete; the enumeration values
0056:         * of the {@code RoundingMode} {@code enum}, (such as {@link
0057:         * RoundingMode#HALF_UP}) should be used instead.
0058:         * 
0059:         * <p>When a {@code MathContext} object is supplied with a precision
0060:         * setting of 0 (for example, {@link MathContext#UNLIMITED}),
0061:         * arithmetic operations are exact, as are the arithmetic methods
0062:         * which take no {@code MathContext} object.  (This is the only
0063:         * behavior that was supported in releases prior to 5.)  As a
0064:         * corollary of computing the exact result, the rounding mode setting
0065:         * of a {@code MathContext} object with a precision setting of 0 is
0066:         * not used and thus irrelevant.  In the case of divide, the exact
0067:         * quotient could have an infinitely long decimal expansion; for
0068:         * example, 1 divided by 3.  If the quotient has a nonterminating
0069:         * decimal expansion and the operation is specified to return an exact
0070:         * result, an {@code ArithmeticException} is thrown.  Otherwise, the
0071:         * exact result of the division is returned, as done for other
0072:         * operations.
0073:         *
0074:         * <p>When the precision setting is not 0, the rules of
0075:         * {@code BigDecimal} arithmetic are broadly compatible with selected
0076:         * modes of operation of the arithmetic defined in ANSI X3.274-1996
0077:         * and ANSI X3.274-1996/AM 1-2000 (section 7.4).  Unlike those
0078:         * standards, {@code BigDecimal} includes many rounding modes, which
0079:         * were mandatory for division in {@code BigDecimal} releases prior
0080:         * to 5.  Any conflicts between these ANSI standards and the
0081:         * {@code BigDecimal} specification are resolved in favor of
0082:         * {@code BigDecimal}.  
0083:         *
0084:         * <p>Since the same numerical value can have different
0085:         * representations (with different scales), the rules of arithmetic
0086:         * and rounding must specify both the numerical result and the scale
0087:         * used in the result's representation.
0088:         *
0089:         *
0090:         * <p>In general the rounding modes and precision setting determine
0091:         * how operations return results with a limited number of digits when
0092:         * the exact result has more digits (perhaps infinitely many in the
0093:         * case of division) than the number of digits returned.
0094:         *
0095:         * First, the
0096:         * total number of digits to return is specified by the
0097:         * {@code MathContext}'s {@code precision} setting; this determines
0098:         * the result's <i>precision</i>.  The digit count starts from the
0099:         * leftmost nonzero digit of the exact result.  The rounding mode
0100:         * determines how any discarded trailing digits affect the returned
0101:         * result.
0102:         *
0103:         * <p>For all arithmetic operators , the operation is carried out as
0104:         * though an exact intermediate result were first calculated and then
0105:         * rounded to the number of digits specified by the precision setting
0106:         * (if necessary), using the selected rounding mode.  If the exact
0107:         * result is not returned, some digit positions of the exact result
0108:         * are discarded.  When rounding increases the magnitude of the
0109:         * returned result, it is possible for a new digit position to be
0110:         * created by a carry propagating to a leading {@literal "9"} digit.
0111:         * For example, rounding the value 999.9 to three digits rounding up
0112:         * would be numerically equal to one thousand, represented as
0113:         * 100&times;10<sup>1</sup>.  In such cases, the new {@literal "1"} is
0114:         * the leading digit position of the returned result.
0115:         *
0116:         * <p>Besides a logical exact result, each arithmetic operation has a
0117:         * preferred scale for representing a result.  The preferred
0118:         * scale for each operation is listed in the table below.
0119:         *
0120:         * <table border>
0121:         * <caption top><h3>Preferred Scales for Results of Arithmetic Operations
0122:         * </h3></caption>
0123:         * <tr><th>Operation</th><th>Preferred Scale of Result</th></tr>
0124:         * <tr><td>Add</td><td>max(addend.scale(), augend.scale())</td>
0125:         * <tr><td>Subtract</td><td>max(minuend.scale(), subtrahend.scale())</td>
0126:         * <tr><td>Multiply</td><td>multiplier.scale() + multiplicand.scale()</td>
0127:         * <tr><td>Divide</td><td>dividend.scale() - divisor.scale()</td>
0128:         * </table>
0129:         *
0130:         * These scales are the ones used by the methods which return exact
0131:         * arithmetic results; except that an exact divide may have to use a
0132:         * larger scale since the exact result may have more digits.  For
0133:         * example, {@code 1/32} is {@code 0.03125}.
0134:         *
0135:         * <p>Before rounding, the scale of the logical exact intermediate
0136:         * result is the preferred scale for that operation.  If the exact
0137:         * numerical result cannot be represented in {@code precision}
0138:         * digits, rounding selects the set of digits to return and the scale
0139:         * of the result is reduced from the scale of the intermediate result
0140:         * to the least scale which can represent the {@code precision}
0141:         * digits actually returned.  If the exact result can be represented
0142:         * with at most {@code precision} digits, the representation
0143:         * of the result with the scale closest to the preferred scale is
0144:         * returned.  In particular, an exactly representable quotient may be
0145:         * represented in fewer than {@code precision} digits by removing
0146:         * trailing zeros and decreasing the scale.  For example, rounding to
0147:         * three digits using the {@linkplain RoundingMode#FLOOR floor}
0148:         * rounding mode, <br>
0149:         *
0150:         * {@code 19/100 = 0.19   // integer=19,  scale=2} <br>
0151:         *
0152:         * but<br>
0153:         *
0154:         * {@code 21/110 = 0.190  // integer=190, scale=3} <br>
0155:         *
0156:         * <p>Note that for add, subtract, and multiply, the reduction in
0157:         * scale will equal the number of digit positions of the exact result
0158:         * which are discarded. If the rounding causes a carry propagation to
0159:         * create a new high-order digit position, an additional digit of the
0160:         * result is discarded than when no new digit position is created.
0161:         *
0162:         * <p>Other methods may have slightly different rounding semantics.
0163:         * For example, the result of the {@code pow} method using the
0164:         * {@linkplain #pow(int, MathContext) specified algorithm} can
0165:         * occasionally differ from the rounded mathematical result by more
0166:         * than one unit in the last place, one <i>{@linkplain #ulp() ulp}</i>.
0167:         *
0168:         * <p>Two types of operations are provided for manipulating the scale
0169:         * of a {@code BigDecimal}: scaling/rounding operations and decimal
0170:         * point motion operations.  Scaling/rounding operations ({@link
0171:         * #setScale setScale} and {@link #round round}) return a
0172:         * {@code BigDecimal} whose value is approximately (or exactly) equal
0173:         * to that of the operand, but whose scale or precision is the
0174:         * specified value; that is, they increase or decrease the precision
0175:         * of the stored number with minimal effect on its value.  Decimal
0176:         * point motion operations ({@link #movePointLeft movePointLeft} and
0177:         * {@link #movePointRight movePointRight}) return a
0178:         * {@code BigDecimal} created from the operand by moving the decimal
0179:         * point a specified distance in the specified direction.
0180:         * 
0181:         * <p>For the sake of brevity and clarity, pseudo-code is used
0182:         * throughout the descriptions of {@code BigDecimal} methods.  The
0183:         * pseudo-code expression {@code (i + j)} is shorthand for "a
0184:         * {@code BigDecimal} whose value is that of the {@code BigDecimal}
0185:         * {@code i} added to that of the {@code BigDecimal}
0186:         * {@code j}." The pseudo-code expression {@code (i == j)} is
0187:         * shorthand for "{@code true} if and only if the
0188:         * {@code BigDecimal} {@code i} represents the same value as the
0189:         * {@code BigDecimal} {@code j}." Other pseudo-code expressions
0190:         * are interpreted similarly.  Square brackets are used to represent
0191:         * the particular {@code BigInteger} and scale pair defining a
0192:         * {@code BigDecimal} value; for example [19, 2] is the
0193:         * {@code BigDecimal} numerically equal to 0.19 having a scale of 2.
0194:         *
0195:         * <p>Note: care should be exercised if {@code BigDecimal} objects
0196:         * are used as keys in a {@link java.util.SortedMap SortedMap} or
0197:         * elements in a {@link java.util.SortedSet SortedSet} since
0198:         * {@code BigDecimal}'s <i>natural ordering</i> is <i>inconsistent
0199:         * with equals</i>.  See {@link Comparable}, {@link
0200:         * java.util.SortedMap} or {@link java.util.SortedSet} for more
0201:         * information.
0202:         * 
0203:         * <p>All methods and constructors for this class throw
0204:         * {@code NullPointerException} when passed a {@code null} object
0205:         * reference for any input parameter.
0206:         *
0207:         * @see     BigInteger
0208:         * @see     MathContext
0209:         * @see     RoundingMode
0210:         * @see     java.util.SortedMap
0211:         * @see     java.util.SortedSet
0212:         * @author  Josh Bloch
0213:         * @author  Mike Cowlishaw
0214:         * @author  Joseph D. Darcy
0215:         */
0216:        public class BigDecimal extends Number implements 
0217:                Comparable<BigDecimal> {
0218:            /**
0219:             * The unscaled value of this BigDecimal, as returned by {@link
0220:             * #unscaledValue}.
0221:             *
0222:             * @serial
0223:             * @see #unscaledValue
0224:             */
0225:            private volatile BigInteger intVal;
0226:
0227:            /**
0228:             * The scale of this BigDecimal, as returned by {@link #scale}.
0229:             *
0230:             * @serial
0231:             * @see #scale
0232:             */
0233:            private int scale = 0; // Note: this may have any value, so
0234:            // calculations must be done in longs
0235:            /**
0236:             * The number of decimal digits in this BigDecimal, or 0 if the
0237:             * number of digits are not known (lookaside information).  If
0238:             * nonzero, the value is guaranteed correct.  Use the precision()
0239:             * method to obtain and set the value if it might be 0.  This
0240:             * field is mutable until set nonzero.
0241:             *
0242:             * @since  1.5
0243:             */
0244:            private volatile transient int precision = 0;
0245:
0246:            /**
0247:             * Used to store the canonical string representation, if computed.
0248:             */
0249:            private volatile transient String stringCache = null;
0250:
0251:            /**
0252:             * Sentinel value for {@link #intCompact} indicating the
0253:             * significand information is only available from {@code intVal}.
0254:             */
0255:            private static final long INFLATED = Long.MIN_VALUE;
0256:
0257:            /**
0258:             * If the absolute value of the significand of this BigDecimal is
0259:             * less than or equal to {@code Long.MAX_VALUE}, the value can be
0260:             * compactly stored in this field and used in computations.
0261:             */
0262:            private transient long intCompact = INFLATED;
0263:
0264:            // All 18-digit base ten strings fit into a long; not all 19-digit
0265:            // strings will
0266:            private static final int MAX_COMPACT_DIGITS = 18;
0267:
0268:            private static final int MAX_BIGINT_BITS = 62;
0269:
0270:            /* Appease the serialization gods */
0271:            private static final long serialVersionUID = 6108874887143696463L;
0272:
0273:            // Cache of common small BigDecimal values.
0274:            private static final BigDecimal zeroThroughTen[] = {
0275:                    new BigDecimal(BigInteger.ZERO, 0, 0),
0276:                    new BigDecimal(BigInteger.ONE, 1, 0),
0277:                    new BigDecimal(BigInteger.valueOf(2), 2, 0),
0278:                    new BigDecimal(BigInteger.valueOf(3), 3, 0),
0279:                    new BigDecimal(BigInteger.valueOf(4), 4, 0),
0280:                    new BigDecimal(BigInteger.valueOf(5), 5, 0),
0281:                    new BigDecimal(BigInteger.valueOf(6), 6, 0),
0282:                    new BigDecimal(BigInteger.valueOf(7), 7, 0),
0283:                    new BigDecimal(BigInteger.valueOf(8), 8, 0),
0284:                    new BigDecimal(BigInteger.valueOf(9), 9, 0),
0285:                    new BigDecimal(BigInteger.TEN, 10, 0), };
0286:
0287:            // Constants
0288:            /**
0289:             * The value 0, with a scale of 0.
0290:             *
0291:             * @since  1.5
0292:             */
0293:            public static final BigDecimal ZERO = zeroThroughTen[0];
0294:
0295:            /**
0296:             * The value 1, with a scale of 0.
0297:             *
0298:             * @since  1.5
0299:             */
0300:            public static final BigDecimal ONE = zeroThroughTen[1];
0301:
0302:            /**
0303:             * The value 10, with a scale of 0.
0304:             *
0305:             * @since  1.5
0306:             */
0307:            public static final BigDecimal TEN = zeroThroughTen[10];
0308:
0309:            // Constructors
0310:
0311:            /**
0312:             * Translates a character array representation of a
0313:             * {@code BigDecimal} into a {@code BigDecimal}, accepting the
0314:             * same sequence of characters as the {@link #BigDecimal(String)}
0315:             * constructor, while allowing a sub-array to be specified.
0316:             * 
0317:             * <p>Note that if the sequence of characters is already available
0318:             * within a character array, using this constructor is faster than
0319:             * converting the {@code char} array to string and using the
0320:             * {@code BigDecimal(String)} constructor .
0321:             *
0322:             * @param  in {@code char} array that is the source of characters.
0323:             * @param  offset first character in the array to inspect.
0324:             * @param  len number of characters to consider.
0325:             * @throws NumberFormatException if {@code in} is not a valid
0326:             *         representation of a {@code BigDecimal} or the defined subarray
0327:             *         is not wholly within {@code in}.
0328:             * @since  1.5
0329:             */
0330:            public BigDecimal(char[] in, int offset, int len) {
0331:                // This is the primary string to BigDecimal constructor; all
0332:                // incoming strings end up here; it uses explicit (inline)
0333:                // parsing for speed and generates at most one intermediate
0334:                // (temporary) object (a char[] array).
0335:
0336:                // use array bounds checking to handle too-long, len == 0,
0337:                // bad offset, etc.
0338:                try {
0339:                    // handle the sign
0340:                    boolean isneg = false; // assume positive
0341:                    if (in[offset] == '-') {
0342:                        isneg = true; // leading minus means negative
0343:                        offset++;
0344:                        len--;
0345:                    } else if (in[offset] == '+') { // leading + allowed
0346:                        offset++;
0347:                        len--;
0348:                    }
0349:
0350:                    // should now be at numeric part of the significand
0351:                    int dotoff = -1; // '.' offset, -1 if none
0352:                    int cfirst = offset; // record start of integer
0353:                    long exp = 0; // exponent
0354:                    if (len > in.length) // protect against huge length
0355:                        throw new NumberFormatException();
0356:                    char coeff[] = new char[len]; // integer significand array
0357:                    char c; // work
0358:
0359:                    for (; len > 0; offset++, len--) {
0360:                        c = in[offset];
0361:                        if ((c >= '0' && c <= '9') || Character.isDigit(c)) {
0362:                            // have digit
0363:                            coeff[precision] = c;
0364:                            precision++; // count of digits
0365:                            continue;
0366:                        }
0367:                        if (c == '.') {
0368:                            // have dot
0369:                            if (dotoff >= 0) // two dots
0370:                                throw new NumberFormatException();
0371:                            dotoff = offset;
0372:                            continue;
0373:                        }
0374:                        // exponent expected
0375:                        if ((c != 'e') && (c != 'E'))
0376:                            throw new NumberFormatException();
0377:                        offset++;
0378:                        c = in[offset];
0379:                        len--;
0380:                        boolean negexp = false;
0381:                        // optional sign
0382:                        if (c == '-' || c == '+') {
0383:                            negexp = (c == '-');
0384:                            offset++;
0385:                            c = in[offset];
0386:                            len--;
0387:                        }
0388:                        if (len <= 0) // no exponent digits
0389:                            throw new NumberFormatException();
0390:                        // skip leading zeros in the exponent 
0391:                        while (len > 10 && Character.digit(c, 10) == 0) {
0392:                            offset++;
0393:                            c = in[offset];
0394:                            len--;
0395:                        }
0396:                        if (len > 10) // too many nonzero exponent digits
0397:                            throw new NumberFormatException();
0398:                        // c now holds first digit of exponent
0399:                        for (;; len--) {
0400:                            int v;
0401:                            if (c >= '0' && c <= '9') {
0402:                                v = c - '0';
0403:                            } else {
0404:                                v = Character.digit(c, 10);
0405:                                if (v < 0) // not a digit
0406:                                    throw new NumberFormatException();
0407:                            }
0408:                            exp = exp * 10 + v;
0409:                            if (len == 1)
0410:                                break; // that was final character
0411:                            offset++;
0412:                            c = in[offset];
0413:                        }
0414:                        if (negexp) // apply sign
0415:                            exp = -exp;
0416:                        // Next test is required for backwards compatibility
0417:                        if ((int) exp != exp) // overflow
0418:                            throw new NumberFormatException();
0419:                        break; // [saves a test]
0420:                    }
0421:                    // here when no characters left
0422:                    if (precision == 0) // no digits found
0423:                        throw new NumberFormatException();
0424:
0425:                    if (dotoff >= 0) { // had dot; set scale
0426:                        scale = precision - (dotoff - cfirst);
0427:                        // [cannot overflow]
0428:                    }
0429:                    if (exp != 0) { // had significant exponent
0430:                        try {
0431:                            scale = checkScale(-exp + scale); // adjust
0432:                        } catch (ArithmeticException e) {
0433:                            throw new NumberFormatException(
0434:                                    "Scale out of range.");
0435:                        }
0436:                    }
0437:
0438:                    // Remove leading zeros from precision (digits count)
0439:                    int first = 0;
0440:                    for (; (coeff[first] == '0' || Character.digit(
0441:                            coeff[first], 10) == 0)
0442:                            && precision > 1; first++)
0443:                        precision--;
0444:
0445:                    // Set the significand ..
0446:                    // Copy significand to exact-sized array, with sign if
0447:                    // negative
0448:                    // Later use: BigInteger(coeff, first, precision) for
0449:                    //   both cases, by allowing an extra char at the front of
0450:                    //   coeff.
0451:                    char quick[];
0452:                    if (!isneg) {
0453:                        quick = new char[precision];
0454:                        System.arraycopy(coeff, first, quick, 0, precision);
0455:                    } else {
0456:                        quick = new char[precision + 1];
0457:                        quick[0] = '-';
0458:                        System.arraycopy(coeff, first, quick, 1, precision);
0459:                    }
0460:                    if (precision <= MAX_COMPACT_DIGITS)
0461:                        intCompact = Long.parseLong(new String(quick));
0462:                    else
0463:                        intVal = new BigInteger(quick);
0464:                    // System.out.println(" new: " +intVal+" ["+scale+"] "+precision);
0465:                } catch (ArrayIndexOutOfBoundsException e) {
0466:                    throw new NumberFormatException();
0467:                } catch (NegativeArraySizeException e) {
0468:                    throw new NumberFormatException();
0469:                }
0470:            }
0471:
0472:            /**
0473:             * Translates a character array representation of a
0474:             * {@code BigDecimal} into a {@code BigDecimal}, accepting the
0475:             * same sequence of characters as the {@link #BigDecimal(String)}
0476:             * constructor, while allowing a sub-array to be specified and
0477:             * with rounding according to the context settings.
0478:             * 
0479:             * <p>Note that if the sequence of characters is already available
0480:             * within a character array, using this constructor is faster than
0481:             * converting the {@code char} array to string and using the
0482:             * {@code BigDecimal(String)} constructor .
0483:             *
0484:             * @param  in {@code char} array that is the source of characters.
0485:             * @param  offset first character in the array to inspect.
0486:             * @param  len number of characters to consider..
0487:             * @param  mc the context to use.
0488:             * @throws ArithmeticException if the result is inexact but the
0489:             *         rounding mode is {@code UNNECESSARY}.
0490:             * @throws NumberFormatException if {@code in} is not a valid
0491:             *         representation of a {@code BigDecimal} or the defined subarray
0492:             *         is not wholly within {@code in}.
0493:             * @since  1.5
0494:             */
0495:            public BigDecimal(char[] in, int offset, int len, MathContext mc) {
0496:                this (in, offset, len);
0497:                if (mc.precision > 0)
0498:                    roundThis(mc);
0499:            }
0500:
0501:            /**
0502:             * Translates a character array representation of a
0503:             * {@code BigDecimal} into a {@code BigDecimal}, accepting the
0504:             * same sequence of characters as the {@link #BigDecimal(String)}
0505:             * constructor.
0506:             * 
0507:             * <p>Note that if the sequence of characters is already available
0508:             * as a character array, using this constructor is faster than
0509:             * converting the {@code char} array to string and using the
0510:             * {@code BigDecimal(String)} constructor .
0511:             *
0512:             * @param in {@code char} array that is the source of characters.
0513:             * @throws NumberFormatException if {@code in} is not a valid
0514:             *         representation of a {@code BigDecimal}.
0515:             * @since  1.5
0516:             */
0517:            public BigDecimal(char[] in) {
0518:                this (in, 0, in.length);
0519:            }
0520:
0521:            /**
0522:             * Translates a character array representation of a
0523:             * {@code BigDecimal} into a {@code BigDecimal}, accepting the
0524:             * same sequence of characters as the {@link #BigDecimal(String)}
0525:             * constructor and with rounding according to the context
0526:             * settings.
0527:             * 
0528:             * <p>Note that if the sequence of characters is already available
0529:             * as a character array, using this constructor is faster than
0530:             * converting the {@code char} array to string and using the
0531:             * {@code BigDecimal(String)} constructor .
0532:             *
0533:             * @param  in {@code char} array that is the source of characters.
0534:             * @param  mc the context to use.
0535:             * @throws ArithmeticException if the result is inexact but the
0536:             *         rounding mode is {@code UNNECESSARY}.
0537:             * @throws NumberFormatException if {@code in} is not a valid
0538:             *         representation of a {@code BigDecimal}.
0539:             * @since  1.5
0540:             */
0541:            public BigDecimal(char[] in, MathContext mc) {
0542:                this (in, 0, in.length, mc);
0543:            }
0544:
0545:            /**
0546:             * Translates the string representation of a {@code BigDecimal}
0547:             * into a {@code BigDecimal}.  The string representation consists
0548:             * of an optional sign, {@code '+'} (<tt> '&#92;u002B'</tt>) or
0549:             * {@code '-'} (<tt>'&#92;u002D'</tt>), followed by a sequence of
0550:             * zero or more decimal digits ("the integer"), optionally
0551:             * followed by a fraction, optionally followed by an exponent.
0552:             * 
0553:             * <p>The fraction consists of a decimal point followed by zero
0554:             * or more decimal digits.  The string must contain at least one
0555:             * digit in either the integer or the fraction.  The number formed
0556:             * by the sign, the integer and the fraction is referred to as the
0557:             * <i>significand</i>.
0558:             *
0559:             * <p>The exponent consists of the character {@code 'e'}
0560:             * (<tt>'&#92;u0065'</tt>) or {@code 'E'} (<tt>'&#92;u0045'</tt>)
0561:             * followed by one or more decimal digits.  The value of the
0562:             * exponent must lie between -{@link Integer#MAX_VALUE} ({@link
0563:             * Integer#MIN_VALUE}+1) and {@link Integer#MAX_VALUE}, inclusive.
0564:             *
0565:             * <p>More formally, the strings this constructor accepts are
0566:             * described by the following grammar:
0567:             * <blockquote>
0568:             * <dl>
0569:             * <dt><i>BigDecimalString:</i>
0570:             * <dd><i>Sign<sub>opt</sub> Significand Exponent<sub>opt</sub></i>
0571:             * <p>
0572:             * <dt><i>Sign:</i>
0573:             * <dd>{@code +}
0574:             * <dd>{@code -}
0575:             * <p>
0576:             * <dt><i>Significand:</i>
0577:             * <dd><i>IntegerPart</i> {@code .} <i>FractionPart<sub>opt</sub></i>
0578:             * <dd>{@code .} <i>FractionPart</i>
0579:             * <dd><i>IntegerPart</i>
0580:             * <p>
0581:             * <dt><i>IntegerPart:
0582:             * <dd>Digits</i>
0583:             * <p>
0584:             * <dt><i>FractionPart:
0585:             * <dd>Digits</i>
0586:             * <p>
0587:             * <dt><i>Exponent:
0588:             * <dd>ExponentIndicator SignedInteger</i>
0589:             * <p>
0590:             * <dt><i>ExponentIndicator:</i>
0591:             * <dd>{@code e}
0592:             * <dd>{@code E}
0593:             * <p>
0594:             * <dt><i>SignedInteger:
0595:             * <dd>Sign<sub>opt</sub> Digits</i>
0596:             * <p>
0597:             * <dt><i>Digits:
0598:             * <dd>Digit
0599:             * <dd>Digits Digit</i>
0600:             * <p>
0601:             * <dt><i>Digit:</i>
0602:             * <dd>any character for which {@link Character#isDigit}
0603:             * returns {@code true}, including 0, 1, 2 ...
0604:             * </dl>
0605:             * </blockquote>
0606:             *
0607:             * <p>The scale of the returned {@code BigDecimal} will be the
0608:             * number of digits in the fraction, or zero if the string
0609:             * contains no decimal point, subject to adjustment for any
0610:             * exponent; if the string contains an exponent, the exponent is
0611:             * subtracted from the scale.  The value of the resulting scale
0612:             * must lie between {@code Integer.MIN_VALUE} and
0613:             * {@code Integer.MAX_VALUE}, inclusive.
0614:             *
0615:             * <p>The character-to-digit mapping is provided by {@link
0616:             * java.lang.Character#digit} set to convert to radix 10.  The
0617:             * String may not contain any extraneous characters (whitespace,
0618:             * for example).
0619:             *
0620:             * <p><b>Examples:</b><br>
0621:             * The value of the returned {@code BigDecimal} is equal to
0622:             * <i>significand</i> &times; 10<sup>&nbsp;<i>exponent</i></sup>.  
0623:             * For each string on the left, the resulting representation
0624:             * [{@code BigInteger}, {@code scale}] is shown on the right.
0625:             * <pre>
0626:             * "0"            [0,0]
0627:             * "0.00"         [0,2]
0628:             * "123"          [123,0]
0629:             * "-123"         [-123,0]
0630:             * "1.23E3"       [123,-1]
0631:             * "1.23E+3"      [123,-1]
0632:             * "12.3E+7"      [123,-6]
0633:             * "12.0"         [120,1]
0634:             * "12.3"         [123,1]
0635:             * "0.00123"      [123,5]
0636:             * "-1.23E-12"    [-123,14]
0637:             * "1234.5E-4"    [12345,5]
0638:             * "0E+7"         [0,-7]
0639:             * "-0"           [0,0]
0640:             * </pre>
0641:             *
0642:             * <p>Note: For values other than {@code float} and
0643:             * {@code double} NaN and &plusmn;Infinity, this constructor is
0644:             * compatible with the values returned by {@link Float#toString}
0645:             * and {@link Double#toString}.  This is generally the preferred
0646:             * way to convert a {@code float} or {@code double} into a
0647:             * BigDecimal, as it doesn't suffer from the unpredictability of
0648:             * the {@link #BigDecimal(double)} constructor.
0649:             *
0650:             * @param val String representation of {@code BigDecimal}.
0651:             *
0652:             * @throws NumberFormatException if {@code val} is not a valid 
0653:             *	       representation of a {@code BigDecimal}.
0654:             */
0655:            public BigDecimal(String val) {
0656:                this (val.toCharArray(), 0, val.length());
0657:            }
0658:
0659:            /**
0660:             * Translates the string representation of a {@code BigDecimal}
0661:             * into a {@code BigDecimal}, accepting the same strings as the
0662:             * {@link #BigDecimal(String)} constructor, with rounding
0663:             * according to the context settings.
0664:             * 
0665:             * @param  val string representation of a {@code BigDecimal}.
0666:             * @param  mc the context to use.
0667:             * @throws ArithmeticException if the result is inexact but the
0668:             *         rounding mode is {@code UNNECESSARY}.
0669:             * @throws NumberFormatException if {@code val} is not a valid
0670:             *         representation of a BigDecimal.
0671:             * @since  1.5
0672:             */
0673:            public BigDecimal(String val, MathContext mc) {
0674:                this (val.toCharArray(), 0, val.length());
0675:                if (mc.precision > 0)
0676:                    roundThis(mc);
0677:            }
0678:
0679:            /**
0680:             * Translates a {@code double} into a {@code BigDecimal} which
0681:             * is the exact decimal representation of the {@code double}'s
0682:             * binary floating-point value.  The scale of the returned
0683:             * {@code BigDecimal} is the smallest value such that
0684:             * <tt>(10<sup>scale</sup> &times; val)</tt> is an integer.
0685:             * <p>
0686:             * <b>Notes:</b>
0687:             * <ol>
0688:             * <li>
0689:             * The results of this constructor can be somewhat unpredictable.
0690:             * One might assume that writing {@code new BigDecimal(0.1)} in
0691:             * Java creates a {@code BigDecimal} which is exactly equal to
0692:             * 0.1 (an unscaled value of 1, with a scale of 1), but it is
0693:             * actually equal to
0694:             * 0.1000000000000000055511151231257827021181583404541015625.
0695:             * This is because 0.1 cannot be represented exactly as a
0696:             * {@code double} (or, for that matter, as a binary fraction of
0697:             * any finite length).  Thus, the value that is being passed
0698:             * <i>in</i> to the constructor is not exactly equal to 0.1,
0699:             * appearances notwithstanding.
0700:             *
0701:             * <li>
0702:             * The {@code String} constructor, on the other hand, is
0703:             * perfectly predictable: writing {@code new BigDecimal("0.1")}
0704:             * creates a {@code BigDecimal} which is <i>exactly</i> equal to
0705:             * 0.1, as one would expect.  Therefore, it is generally
0706:             * recommended that the {@linkplain #BigDecimal(String)
0707:             * <tt>String</tt> constructor} be used in preference to this one.
0708:             *
0709:             * <li>
0710:             * When a {@code double} must be used as a source for a
0711:             * {@code BigDecimal}, note that this constructor provides an
0712:             * exact conversion; it does not give the same result as
0713:             * converting the {@code double} to a {@code String} using the
0714:             * {@link Double#toString(double)} method and then using the
0715:             * {@link #BigDecimal(String)} constructor.  To get that result,
0716:             * use the {@code static} {@link #valueOf(double)} method.
0717:             * </ol>
0718:             *
0719:             * @param val {@code double} value to be converted to 
0720:             *        {@code BigDecimal}.
0721:             * @throws NumberFormatException if {@code val} is infinite or NaN.
0722:             */
0723:            public BigDecimal(double val) {
0724:                if (Double.isInfinite(val) || Double.isNaN(val))
0725:                    throw new NumberFormatException("Infinite or NaN");
0726:
0727:                // Translate the double into sign, exponent and significand, according
0728:                // to the formulae in JLS, Section 20.10.22.
0729:                long valBits = Double.doubleToLongBits(val);
0730:                int sign = ((valBits >> 63) == 0 ? 1 : -1);
0731:                int exponent = (int) ((valBits >> 52) & 0x7ffL);
0732:                long significand = (exponent == 0 ? (valBits & ((1L << 52) - 1)) << 1
0733:                        : (valBits & ((1L << 52) - 1)) | (1L << 52));
0734:                exponent -= 1075;
0735:                // At this point, val == sign * significand * 2**exponent.
0736:
0737:                /*
0738:                 * Special case zero to supress nonterminating normalization
0739:                 * and bogus scale calculation.
0740:                 */
0741:                if (significand == 0) {
0742:                    intVal = BigInteger.ZERO;
0743:                    intCompact = 0;
0744:                    precision = 1;
0745:                    return;
0746:                }
0747:
0748:                // Normalize
0749:                while ((significand & 1) == 0) { //  i.e., significand is even
0750:                    significand >>= 1;
0751:                    exponent++;
0752:                }
0753:
0754:                // Calculate intVal and scale
0755:                intVal = BigInteger.valueOf(sign * significand);
0756:                if (exponent < 0) {
0757:                    intVal = intVal.multiply(BigInteger.valueOf(5).pow(
0758:                            -exponent));
0759:                    scale = -exponent;
0760:                } else if (exponent > 0) {
0761:                    intVal = intVal.multiply(BigInteger.valueOf(2)
0762:                            .pow(exponent));
0763:                }
0764:                if (intVal.bitLength() <= MAX_BIGINT_BITS) {
0765:                    intCompact = intVal.longValue();
0766:                }
0767:            }
0768:
0769:            /**
0770:             * Translates a {@code double} into a {@code BigDecimal}, with
0771:             * rounding according to the context settings.  The scale of the
0772:             * {@code BigDecimal} is the smallest value such that
0773:             * <tt>(10<sup>scale</sup> &times; val)</tt> is an integer.
0774:             * 
0775:             * <p>The results of this constructor can be somewhat unpredictable
0776:             * and its use is generally not recommended; see the notes under
0777:             * the {@link #BigDecimal(double)} constructor.
0778:             *
0779:             * @param  val {@code double} value to be converted to 
0780:             *         {@code BigDecimal}.
0781:             * @param  mc the context to use.
0782:             * @throws ArithmeticException if the result is inexact but the
0783:             *         RoundingMode is UNNECESSARY.
0784:             * @throws NumberFormatException if {@code val} is infinite or NaN.
0785:             * @since  1.5
0786:             */
0787:            public BigDecimal(double val, MathContext mc) {
0788:                this (val);
0789:                if (mc.precision > 0)
0790:                    roundThis(mc);
0791:            }
0792:
0793:            /**
0794:             * Translates a {@code BigInteger} into a {@code BigDecimal}.
0795:             * The scale of the {@code BigDecimal} is zero.
0796:             *
0797:             * @param val {@code BigInteger} value to be converted to
0798:             *            {@code BigDecimal}.
0799:             */
0800:            public BigDecimal(BigInteger val) {
0801:                intVal = val;
0802:                if (val.bitLength() <= MAX_BIGINT_BITS) {
0803:                    intCompact = val.longValue();
0804:                }
0805:            }
0806:
0807:            /**
0808:             * Translates a {@code BigInteger} into a {@code BigDecimal}
0809:             * rounding according to the context settings.  The scale of the
0810:             * {@code BigDecimal} is zero.
0811:             * 
0812:             * @param val {@code BigInteger} value to be converted to
0813:             *            {@code BigDecimal}.
0814:             * @param  mc the context to use.
0815:             * @throws ArithmeticException if the result is inexact but the
0816:             *         rounding mode is {@code UNNECESSARY}.
0817:             * @since  1.5
0818:             */
0819:            public BigDecimal(BigInteger val, MathContext mc) {
0820:                intVal = val;
0821:                if (mc.precision > 0)
0822:                    roundThis(mc);
0823:            }
0824:
0825:            /**
0826:             * Translates a {@code BigInteger} unscaled value and an
0827:             * {@code int} scale into a {@code BigDecimal}.  The value of
0828:             * the {@code BigDecimal} is
0829:             * <tt>(unscaledVal &times; 10<sup>-scale</sup>)</tt>.
0830:             *
0831:             * @param unscaledVal unscaled value of the {@code BigDecimal}.
0832:             * @param scale scale of the {@code BigDecimal}.
0833:             */
0834:            public BigDecimal(BigInteger unscaledVal, int scale) {
0835:                // Negative scales are now allowed
0836:                intVal = unscaledVal;
0837:                this .scale = scale;
0838:                if (unscaledVal.bitLength() <= MAX_BIGINT_BITS) {
0839:                    intCompact = unscaledVal.longValue();
0840:                }
0841:            }
0842:
0843:            /**
0844:             * Translates a {@code BigInteger} unscaled value and an
0845:             * {@code int} scale into a {@code BigDecimal}, with rounding
0846:             * according to the context settings.  The value of the
0847:             * {@code BigDecimal} is <tt>(unscaledVal &times;
0848:             * 10<sup>-scale</sup>)</tt>, rounded according to the
0849:             * {@code precision} and rounding mode settings.
0850:             *
0851:             * @param  unscaledVal unscaled value of the {@code BigDecimal}.
0852:             * @param  scale scale of the {@code BigDecimal}.
0853:             * @param  mc the context to use.
0854:             * @throws ArithmeticException if the result is inexact but the
0855:             *         rounding mode is {@code UNNECESSARY}.
0856:             * @since  1.5
0857:             */
0858:            public BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) {
0859:                intVal = unscaledVal;
0860:                this .scale = scale;
0861:                if (mc.precision > 0)
0862:                    roundThis(mc);
0863:            }
0864:
0865:            /**
0866:             * Translates an {@code int} into a {@code BigDecimal}.  The
0867:             * scale of the {@code BigDecimal} is zero.
0868:             *
0869:             * @param val {@code int} value to be converted to
0870:             *            {@code BigDecimal}.
0871:             * @since  1.5
0872:             */
0873:            public BigDecimal(int val) {
0874:                intCompact = val;
0875:            }
0876:
0877:            /**
0878:             * Translates an {@code int} into a {@code BigDecimal}, with
0879:             * rounding according to the context settings.  The scale of the
0880:             * {@code BigDecimal}, before any rounding, is zero.
0881:             * 
0882:             * @param  val {@code int} value to be converted to {@code BigDecimal}.
0883:             * @param  mc the context to use.
0884:             * @throws ArithmeticException if the result is inexact but the
0885:             *         rounding mode is {@code UNNECESSARY}.
0886:             * @since  1.5
0887:             */
0888:            public BigDecimal(int val, MathContext mc) {
0889:                intCompact = val;
0890:                if (mc.precision > 0)
0891:                    roundThis(mc);
0892:            }
0893:
0894:            /**
0895:             * Translates a {@code long} into a {@code BigDecimal}.  The
0896:             * scale of the {@code BigDecimal} is zero.
0897:             *
0898:             * @param val {@code long} value to be converted to {@code BigDecimal}.
0899:             * @since  1.5
0900:             */
0901:            public BigDecimal(long val) {
0902:                if (compactLong(val))
0903:                    intCompact = val;
0904:                else
0905:                    intVal = BigInteger.valueOf(val);
0906:            }
0907:
0908:            /**
0909:             * Translates a {@code long} into a {@code BigDecimal}, with
0910:             * rounding according to the context settings.  The scale of the
0911:             * {@code BigDecimal}, before any rounding, is zero.
0912:             * 
0913:             * @param  val {@code long} value to be converted to {@code BigDecimal}.
0914:             * @param  mc the context to use.
0915:             * @throws ArithmeticException if the result is inexact but the
0916:             *         rounding mode is {@code UNNECESSARY}.
0917:             * @since  1.5
0918:             */
0919:            public BigDecimal(long val, MathContext mc) {
0920:                if (compactLong(val))
0921:                    intCompact = val;
0922:                else
0923:                    intVal = BigInteger.valueOf(val);
0924:                if (mc.precision > 0)
0925:                    roundThis(mc);
0926:            }
0927:
0928:            /**
0929:             * Trusted internal constructor
0930:             */
0931:            private BigDecimal(long val, int scale) {
0932:                this .intCompact = val;
0933:                this .scale = scale;
0934:            }
0935:
0936:            /**
0937:             * Trusted internal constructor
0938:             */
0939:            private BigDecimal(BigInteger intVal, long val, int scale) {
0940:                this .intVal = intVal;
0941:                this .intCompact = val;
0942:                this .scale = scale;
0943:            }
0944:
0945:            // Static Factory Methods
0946:
0947:            /**
0948:             * Translates a {@code long} unscaled value and an
0949:             * {@code int} scale into a {@code BigDecimal}.  This
0950:             * {@literal "static factory method"} is provided in preference to
0951:             * a ({@code long}, {@code int}) constructor because it
0952:             * allows for reuse of frequently used {@code BigDecimal} values..
0953:             *
0954:             * @param unscaledVal unscaled value of the {@code BigDecimal}.
0955:             * @param scale scale of the {@code BigDecimal}.
0956:             * @return a {@code BigDecimal} whose value is
0957:             *	       <tt>(unscaledVal &times; 10<sup>-scale</sup>)</tt>.
0958:             */
0959:            public static BigDecimal valueOf(long unscaledVal, int scale) {
0960:                if (scale == 0 && unscaledVal >= 0 && unscaledVal <= 10) {
0961:                    return zeroThroughTen[(int) unscaledVal];
0962:                }
0963:                if (compactLong(unscaledVal))
0964:                    return new BigDecimal(unscaledVal, scale);
0965:                return new BigDecimal(BigInteger.valueOf(unscaledVal), scale);
0966:            }
0967:
0968:            /**
0969:             * Translates a {@code long} value into a {@code BigDecimal}
0970:             * with a scale of zero.  This {@literal "static factory method"}
0971:             * is provided in preference to a ({@code long}) constructor
0972:             * because it allows for reuse of frequently used
0973:             * {@code BigDecimal} values.
0974:             *
0975:             * @param val value of the {@code BigDecimal}.
0976:             * @return a {@code BigDecimal} whose value is {@code val}.
0977:             */
0978:            public static BigDecimal valueOf(long val) {
0979:                return valueOf(val, 0);
0980:            }
0981:
0982:            /**
0983:             * Translates a {@code double} into a {@code BigDecimal}, using
0984:             * the {@code double}'s canonical string representation provided
0985:             * by the {@link Double#toString(double)} method.
0986:             * 
0987:             * <p><b>Note:</b> This is generally the preferred way to convert
0988:             * a {@code double} (or {@code float}) into a
0989:             * {@code BigDecimal}, as the value returned is equal to that
0990:             * resulting from constructing a {@code BigDecimal} from the
0991:             * result of using {@link Double#toString(double)}.
0992:             *
0993:             * @param  val {@code double} to convert to a {@code BigDecimal}.
0994:             * @return a {@code BigDecimal} whose value is equal to or approximately
0995:             *         equal to the value of {@code val}.
0996:             * @throws NumberFormatException if {@code val} is infinite or NaN.
0997:             * @since  1.5
0998:             */
0999:            public static BigDecimal valueOf(double val) {
1000:                // Reminder: a zero double returns '0.0', so we cannot fastpath
1001:                // to use the constant ZERO.  This might be important enough to
1002:                // justify a factory approach, a cache, or a few private
1003:                // constants, later.
1004:                return new BigDecimal(Double.toString(val));
1005:            }
1006:
1007:            // Arithmetic Operations
1008:            /**
1009:             * Returns a {@code BigDecimal} whose value is {@code (this +
1010:             * augend)}, and whose scale is {@code max(this.scale(),
1011:             * augend.scale())}.
1012:             *
1013:             * @param  augend value to be added to this {@code BigDecimal}.
1014:             * @return {@code this + augend}
1015:             */
1016:            public BigDecimal add(BigDecimal augend) {
1017:                BigDecimal arg[] = { this , augend };
1018:                matchScale(arg);
1019:
1020:                long x = arg[0].intCompact;
1021:                long y = arg[1].intCompact;
1022:
1023:                // Might be able to do a more clever check incorporating the
1024:                // inflated check into the overflow computation.
1025:                if (x != INFLATED && y != INFLATED) {
1026:                    long sum = x + y;
1027:                    /*
1028:                     * If the sum is not an overflowed value, continue to use
1029:                     * the compact representation.  if either of x or y is
1030:                     * INFLATED, the sum should also be regarded as an
1031:                     * overflow.  See "Hacker's Delight" section 2-12 for
1032:                     * explanation of the overflow test.
1033:                     */
1034:                    if ((((sum ^ x) & (sum ^ y)) >> 63) == 0L) // not overflowed
1035:                        return BigDecimal.valueOf(sum, arg[0].scale);
1036:                }
1037:                return new BigDecimal(arg[0].inflate().intVal.add(arg[1]
1038:                        .inflate().intVal), arg[0].scale);
1039:            }
1040:
1041:            /**
1042:             * Returns a {@code BigDecimal} whose value is {@code (this + augend)},
1043:             * with rounding according to the context settings.
1044:             *
1045:             * If either number is zero and the precision setting is nonzero then
1046:             * the other number, rounded if necessary, is used as the result.
1047:             *
1048:             * @param  augend value to be added to this {@code BigDecimal}.
1049:             * @param  mc the context to use.
1050:             * @return {@code this + augend}, rounded as necessary.
1051:             * @throws ArithmeticException if the result is inexact but the
1052:             *         rounding mode is {@code UNNECESSARY}.
1053:             * @since  1.5
1054:             */
1055:            public BigDecimal add(BigDecimal augend, MathContext mc) {
1056:                if (mc.precision == 0)
1057:                    return add(augend);
1058:                BigDecimal lhs = this ;
1059:
1060:                // Could optimize if values are compact
1061:                this .inflate();
1062:                augend.inflate();
1063:
1064:                // If either number is zero then the other number, rounded and
1065:                // scaled if necessary, is used as the result.
1066:                {
1067:                    boolean lhsIsZero = lhs.signum() == 0;
1068:                    boolean augendIsZero = augend.signum() == 0;
1069:
1070:                    if (lhsIsZero || augendIsZero) {
1071:                        int preferredScale = Math.max(lhs.scale(), augend
1072:                                .scale());
1073:                        BigDecimal result;
1074:
1075:                        // Could use a factory for zero instead of a new object
1076:                        if (lhsIsZero && augendIsZero)
1077:                            return new BigDecimal(BigInteger.ZERO, 0,
1078:                                    preferredScale);
1079:
1080:                        result = lhsIsZero ? augend.doRound(mc) : lhs
1081:                                .doRound(mc);
1082:
1083:                        if (result.scale() == preferredScale)
1084:                            return result;
1085:                        else if (result.scale() > preferredScale)
1086:                            return new BigDecimal(result.intVal,
1087:                                    result.intCompact, result.scale)
1088:                                    .stripZerosToMatchScale(preferredScale);
1089:                        else { // result.scale < preferredScale
1090:                            int precisionDiff = mc.precision
1091:                                    - result.precision();
1092:                            int scaleDiff = preferredScale - result.scale();
1093:
1094:                            if (precisionDiff >= scaleDiff)
1095:                                return result.setScale(preferredScale); // can achieve target scale
1096:                            else
1097:                                return result.setScale(result.scale()
1098:                                        + precisionDiff);
1099:                        }
1100:                    }
1101:                }
1102:
1103:                long padding = (long) lhs.scale - augend.scale;
1104:                if (padding != 0) { // scales differ; alignment needed
1105:                    BigDecimal arg[] = preAlign(lhs, augend, padding, mc);
1106:                    matchScale(arg);
1107:                    lhs = arg[0];
1108:                    augend = arg[1];
1109:                }
1110:
1111:                return new BigDecimal(lhs.inflate().intVal
1112:                        .add(augend.inflate().intVal), lhs.scale).doRound(mc);
1113:            }
1114:
1115:            /**
1116:             * Returns an array of length two, the sum of whose entries is
1117:             * equal to the rounded sum of the {@code BigDecimal} arguments.
1118:             *
1119:             * <p>If the digit positions of the arguments have a sufficient
1120:             * gap between them, the value smaller in magnitude can be
1121:             * condensed into a {@literal "sticky bit"} and the end result will
1122:             * round the same way <em>if</em> the precision of the final
1123:             * result does not include the high order digit of the small
1124:             * magnitude operand.
1125:             *
1126:             * <p>Note that while strictly speaking this is an optimization,
1127:             * it makes a much wider range of additions practical.
1128:             * 
1129:             * <p>This corresponds to a pre-shift operation in a fixed
1130:             * precision floating-point adder; this method is complicated by
1131:             * variable precision of the result as determined by the
1132:             * MathContext.  A more nuanced operation could implement a
1133:             * {@literal "right shift"} on the smaller magnitude operand so
1134:             * that the number of digits of the smaller operand could be
1135:             * reduced even though the significands partially overlapped.
1136:             */
1137:            private BigDecimal[] preAlign(BigDecimal lhs, BigDecimal augend,
1138:                    long padding, MathContext mc) {
1139:                assert padding != 0;
1140:                BigDecimal big;
1141:                BigDecimal small;
1142:
1143:                if (padding < 0) { // lhs is big;   augend is small
1144:                    big = lhs;
1145:                    small = augend;
1146:                } else { // lhs is small; augend is big
1147:                    big = augend;
1148:                    small = lhs;
1149:                }
1150:
1151:                /*
1152:                 * This is the estimated scale of an ulp of the result; it
1153:                 * assumes that the result doesn't have a carry-out on a true
1154:                 * add (e.g. 999 + 1 => 1000) or any subtractive cancellation
1155:                 * on borrowing (e.g. 100 - 1.2 => 98.8)
1156:                 */
1157:                long estResultUlpScale = (long) big.scale - big.precision()
1158:                        + mc.precision;
1159:
1160:                /*
1161:                 * The low-order digit position of big is big.scale().  This
1162:                 * is true regardless of whether big has a positive or
1163:                 * negative scale.  The high-order digit position of small is
1164:                 * small.scale - (small.precision() - 1).  To do the full
1165:                 * condensation, the digit positions of big and small must be
1166:                 * disjoint *and* the digit positions of small should not be
1167:                 * directly visible in the result.
1168:                 */
1169:                long smallHighDigitPos = (long) small.scale - small.precision()
1170:                        + 1;
1171:                if (smallHighDigitPos > big.scale + 2 && // big and small disjoint
1172:                        smallHighDigitPos > estResultUlpScale + 2) { // small digits not visible
1173:                    small = BigDecimal.valueOf(small.signum(),
1174:                            this .checkScale(Math.max(big.scale,
1175:                                    estResultUlpScale) + 3));
1176:                }
1177:
1178:                // Since addition is symmetric, preserving input order in
1179:                // returned operands doesn't matter
1180:                BigDecimal[] result = { big, small };
1181:                return result;
1182:            }
1183:
1184:            /**
1185:             * Returns a {@code BigDecimal} whose value is {@code (this -
1186:             * subtrahend)}, and whose scale is {@code max(this.scale(),
1187:             * subtrahend.scale())}.
1188:             *
1189:             * @param  subtrahend value to be subtracted from this {@code BigDecimal}.
1190:             * @return {@code this - subtrahend}
1191:             */
1192:            public BigDecimal subtract(BigDecimal subtrahend) {
1193:                BigDecimal arg[] = { this , subtrahend };
1194:                matchScale(arg);
1195:
1196:                long x = arg[0].intCompact;
1197:                long y = arg[1].intCompact;
1198:
1199:                // Might be able to do a more clever check incorporating the
1200:                // inflated check into the overflow computation.
1201:                if (x != INFLATED && y != INFLATED) {
1202:                    long difference = x - y;
1203:                    /*
1204:                     * If the difference is not an overflowed value, continue
1205:                     * to use the compact representation.  if either of x or y
1206:                     * is INFLATED, the difference should also be regarded as
1207:                     * an overflow.  See "Hacker's Delight" section 2-12 for
1208:                     * explanation of the overflow test.
1209:                     */
1210:                    if (((x ^ y) & (difference ^ x)) >> 63 == 0L) // not overflowed
1211:                        return BigDecimal.valueOf(difference, arg[0].scale);
1212:                }
1213:                return new BigDecimal(arg[0].inflate().intVal.subtract(arg[1]
1214:                        .inflate().intVal), arg[0].scale);
1215:            }
1216:
1217:            /**
1218:             * Returns a {@code BigDecimal} whose value is {@code (this - subtrahend)},
1219:             * with rounding according to the context settings.
1220:             *
1221:             * If {@code subtrahend} is zero then this, rounded if necessary, is used as the
1222:             * result.  If this is zero then the result is {@code subtrahend.negate(mc)}.
1223:             *
1224:             * @param  subtrahend value to be subtracted from this {@code BigDecimal}.
1225:             * @param  mc the context to use.
1226:             * @return {@code this - subtrahend}, rounded as necessary.
1227:             * @throws ArithmeticException if the result is inexact but the
1228:             *         rounding mode is {@code UNNECESSARY}.
1229:             * @since  1.5
1230:             */
1231:            public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) {
1232:                if (mc.precision == 0)
1233:                    return subtract(subtrahend);
1234:                // share the special rounding code in add()
1235:                this .inflate();
1236:                subtrahend.inflate();
1237:                BigDecimal rhs = new BigDecimal(subtrahend.intVal.negate(),
1238:                        subtrahend.scale);
1239:                rhs.precision = subtrahend.precision;
1240:                return add(rhs, mc);
1241:            }
1242:
1243:            /**
1244:             * Returns a {@code BigDecimal} whose value is <tt>(this &times;
1245:             * multiplicand)</tt>, and whose scale is {@code (this.scale() +
1246:             * multiplicand.scale())}.
1247:             *
1248:             * @param  multiplicand value to be multiplied by this {@code BigDecimal}.
1249:             * @return {@code this * multiplicand}
1250:             */
1251:            public BigDecimal multiply(BigDecimal multiplicand) {
1252:                long x = this .intCompact;
1253:                long y = multiplicand.intCompact;
1254:                int productScale = checkScale((long) scale + multiplicand.scale);
1255:
1256:                // Might be able to do a more clever check incorporating the
1257:                // inflated check into the overflow computation.
1258:                if (x != INFLATED && y != INFLATED) {
1259:                    /*
1260:                     * If the product is not an overflowed value, continue
1261:                     * to use the compact representation.  if either of x or y
1262:                     * is INFLATED, the product should also be regarded as
1263:                     * an overflow.  See "Hacker's Delight" section 2-12 for
1264:                     * explanation of the overflow test.
1265:                     */
1266:                    long product = x * y;
1267:                    if (!(y != 0L && product / y != x)) // not overflowed
1268:                        return BigDecimal.valueOf(product, productScale);
1269:                }
1270:
1271:                BigDecimal result = new BigDecimal(this .inflate().intVal
1272:                        .multiply(multiplicand.inflate().intVal), productScale);
1273:                return result;
1274:            }
1275:
1276:            /**
1277:             * Returns a {@code BigDecimal} whose value is <tt>(this &times;
1278:             * multiplicand)</tt>, with rounding according to the context settings.
1279:             *
1280:             * @param  multiplicand value to be multiplied by this {@code BigDecimal}.
1281:             * @param  mc the context to use.
1282:             * @return {@code this * multiplicand}, rounded as necessary.
1283:             * @throws ArithmeticException if the result is inexact but the
1284:             *         rounding mode is {@code UNNECESSARY}.
1285:             * @since  1.5
1286:             */
1287:            public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) {
1288:                if (mc.precision == 0)
1289:                    return multiply(multiplicand);
1290:                BigDecimal lhs = this ;
1291:                return lhs.inflate().multiply(multiplicand.inflate()).doRound(
1292:                        mc);
1293:            }
1294:
1295:            /**
1296:             * Returns a {@code BigDecimal} whose value is {@code (this /
1297:             * divisor)}, and whose scale is as specified.  If rounding must
1298:             * be performed to generate a result with the specified scale, the
1299:             * specified rounding mode is applied.
1300:             * 
1301:             * <p>The new {@link #divide(BigDecimal, int, RoundingMode)} method
1302:             * should be used in preference to this legacy method.
1303:             * 
1304:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1305:             * @param  scale scale of the {@code BigDecimal} quotient to be returned.
1306:             * @param  roundingMode rounding mode to apply.
1307:             * @return {@code this / divisor}
1308:             * @throws ArithmeticException if {@code divisor} is zero,
1309:             *         {@code roundingMode==ROUND_UNNECESSARY} and
1310:             *         the specified scale is insufficient to represent the result
1311:             *         of the division exactly.
1312:             * @throws IllegalArgumentException if {@code roundingMode} does not
1313:             *         represent a valid rounding mode.
1314:             * @see    #ROUND_UP
1315:             * @see    #ROUND_DOWN
1316:             * @see    #ROUND_CEILING
1317:             * @see    #ROUND_FLOOR
1318:             * @see    #ROUND_HALF_UP
1319:             * @see    #ROUND_HALF_DOWN
1320:             * @see    #ROUND_HALF_EVEN
1321:             * @see    #ROUND_UNNECESSARY
1322:             */
1323:            public BigDecimal divide(BigDecimal divisor, int scale,
1324:                    int roundingMode) {
1325:                /* 
1326:                 * IMPLEMENTATION NOTE: This method *must* return a new object
1327:                 * since dropDigits uses divide to generate a value whose
1328:                 * scale is then modified.
1329:                 */
1330:                if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
1331:                    throw new IllegalArgumentException("Invalid rounding mode");
1332:                /*
1333:                 * Rescale dividend or divisor (whichever can be "upscaled" to
1334:                 * produce correctly scaled quotient).
1335:                 * Take care to detect out-of-range scales
1336:                 */
1337:                BigDecimal dividend;
1338:                if (checkScale((long) scale + divisor.scale) >= this .scale) {
1339:                    dividend = this .setScale(scale + divisor.scale);
1340:                } else {
1341:                    dividend = this ;
1342:                    divisor = divisor.setScale(checkScale((long) this .scale
1343:                            - scale));
1344:                }
1345:
1346:                boolean compact = dividend.intCompact != INFLATED
1347:                        && divisor.intCompact != INFLATED;
1348:                long div = INFLATED;
1349:                long rem = INFLATED;
1350:                ;
1351:                BigInteger q = null, r = null;
1352:
1353:                if (compact) {
1354:                    div = dividend.intCompact / divisor.intCompact;
1355:                    rem = dividend.intCompact % divisor.intCompact;
1356:                } else {
1357:                    // Do the division and return result if it's exact.
1358:                    BigInteger i[] = dividend.inflate().intVal
1359:                            .divideAndRemainder(divisor.inflate().intVal);
1360:                    q = i[0];
1361:                    r = i[1];
1362:                }
1363:
1364:                // Check for exact result
1365:                if (compact) {
1366:                    if (rem == 0)
1367:                        return new BigDecimal(div, scale);
1368:                } else {
1369:                    if (r.signum() == 0)
1370:                        return new BigDecimal(q, scale);
1371:                }
1372:
1373:                if (roundingMode == ROUND_UNNECESSARY) // Rounding prohibited
1374:                    throw new ArithmeticException("Rounding necessary");
1375:
1376:                /* Round as appropriate */
1377:                int signum = dividend.signum() * divisor.signum(); // Sign of result
1378:                boolean increment;
1379:                if (roundingMode == ROUND_UP) { // Away from zero
1380:                    increment = true;
1381:                } else if (roundingMode == ROUND_DOWN) { // Towards zero
1382:                    increment = false;
1383:                } else if (roundingMode == ROUND_CEILING) { // Towards +infinity
1384:                    increment = (signum > 0);
1385:                } else if (roundingMode == ROUND_FLOOR) { // Towards -infinity
1386:                    increment = (signum < 0);
1387:                } else { // Remaining modes based on nearest-neighbor determination
1388:                    int cmpFracHalf;
1389:                    if (compact) {
1390:                        cmpFracHalf = longCompareTo(Math.abs(2 * rem), Math
1391:                                .abs(divisor.intCompact));
1392:                    } else {
1393:                        // add(r) here is faster than multiply(2) or shiftLeft(1)
1394:                        cmpFracHalf = r.add(r).abs().compareTo(
1395:                                divisor.intVal.abs());
1396:                    }
1397:                    if (cmpFracHalf < 0) { // We're closer to higher digit
1398:                        increment = false;
1399:                    } else if (cmpFracHalf > 0) { // We're closer to lower digit
1400:                        increment = true;
1401:                    } else { // We're dead-center
1402:                        if (roundingMode == ROUND_HALF_UP)
1403:                            increment = true;
1404:                        else if (roundingMode == ROUND_HALF_DOWN)
1405:                            increment = false;
1406:                        else { // roundingMode == ROUND_HALF_EVEN
1407:                            if (compact)
1408:                                increment = (div & 1L) != 0L;
1409:                            else
1410:                                increment = q.testBit(0); // true iff q is odd
1411:                        }
1412:                    }
1413:                }
1414:
1415:                if (compact) {
1416:                    if (increment)
1417:                        div += signum; // guaranteed not to overflow
1418:                    return new BigDecimal(div, scale);
1419:                } else {
1420:                    return (increment ? new BigDecimal(q.add(BigInteger
1421:                            .valueOf(signum)), scale)
1422:                            : new BigDecimal(q, scale));
1423:                }
1424:            }
1425:
1426:            /**
1427:             * Returns a {@code BigDecimal} whose value is {@code (this /
1428:             * divisor)}, and whose scale is as specified.  If rounding must
1429:             * be performed to generate a result with the specified scale, the
1430:             * specified rounding mode is applied.
1431:             * 
1432:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1433:             * @param  scale scale of the {@code BigDecimal} quotient to be returned.
1434:             * @param  roundingMode rounding mode to apply.
1435:             * @return {@code this / divisor}
1436:             * @throws ArithmeticException if {@code divisor} is zero,
1437:             *         {@code roundingMode==RoundingMode.UNNECESSARY} and
1438:             *         the specified scale is insufficient to represent the result
1439:             *         of the division exactly.
1440:             * @since 1.5
1441:             */
1442:            public BigDecimal divide(BigDecimal divisor, int scale,
1443:                    RoundingMode roundingMode) {
1444:                return divide(divisor, scale, roundingMode.oldMode);
1445:            }
1446:
1447:            /**
1448:             * Returns a {@code BigDecimal} whose value is {@code (this /
1449:             * divisor)}, and whose scale is {@code this.scale()}.  If
1450:             * rounding must be performed to generate a result with the given
1451:             * scale, the specified rounding mode is applied.
1452:             * 
1453:             * <p>The new {@link #divide(BigDecimal, RoundingMode)} method
1454:             * should be used in preference to this legacy method.
1455:             * 
1456:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1457:             * @param  roundingMode rounding mode to apply.
1458:             * @return {@code this / divisor}
1459:             * @throws ArithmeticException if {@code divisor==0}, or
1460:             *         {@code roundingMode==ROUND_UNNECESSARY} and
1461:             *         {@code this.scale()} is insufficient to represent the result
1462:             *         of the division exactly.
1463:             * @throws IllegalArgumentException if {@code roundingMode} does not
1464:             *         represent a valid rounding mode.
1465:             * @see    #ROUND_UP
1466:             * @see    #ROUND_DOWN
1467:             * @see    #ROUND_CEILING
1468:             * @see    #ROUND_FLOOR
1469:             * @see    #ROUND_HALF_UP
1470:             * @see    #ROUND_HALF_DOWN
1471:             * @see    #ROUND_HALF_EVEN
1472:             * @see    #ROUND_UNNECESSARY
1473:             */
1474:            public BigDecimal divide(BigDecimal divisor, int roundingMode) {
1475:                return this .divide(divisor, scale, roundingMode);
1476:            }
1477:
1478:            /**
1479:             * Returns a {@code BigDecimal} whose value is {@code (this /
1480:             * divisor)}, and whose scale is {@code this.scale()}.  If
1481:             * rounding must be performed to generate a result with the given
1482:             * scale, the specified rounding mode is applied.
1483:             * 
1484:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1485:             * @param  roundingMode rounding mode to apply.
1486:             * @return {@code this / divisor}
1487:             * @throws ArithmeticException if {@code divisor==0}, or
1488:             *         {@code roundingMode==RoundingMode.UNNECESSARY} and
1489:             *         {@code this.scale()} is insufficient to represent the result
1490:             *         of the division exactly.
1491:             * @since 1.5
1492:             */
1493:            public BigDecimal divide(BigDecimal divisor,
1494:                    RoundingMode roundingMode) {
1495:                return this .divide(divisor, scale, roundingMode.oldMode);
1496:            }
1497:
1498:            /**
1499:             * Returns a {@code BigDecimal} whose value is {@code (this /
1500:             * divisor)}, and whose preferred scale is {@code (this.scale() -
1501:             * divisor.scale())}; if the exact quotient cannot be
1502:             * represented (because it has a non-terminating decimal
1503:             * expansion) an {@code ArithmeticException} is thrown.
1504:             *
1505:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1506:             * @throws ArithmeticException if the exact quotient does not have a
1507:             *         terminating decimal expansion
1508:             * @return {@code this / divisor}
1509:             * @since 1.5
1510:             * @author Joseph D. Darcy
1511:             */
1512:            public BigDecimal divide(BigDecimal divisor) {
1513:                /*
1514:                 * Handle zero cases first.
1515:                 */
1516:                if (divisor.signum() == 0) { // x/0
1517:                    if (this .signum() == 0) // 0/0
1518:                        throw new ArithmeticException("Division undefined"); // NaN
1519:                    throw new ArithmeticException("Division by zero");
1520:                }
1521:
1522:                // Calculate preferred scale
1523:                int preferredScale = (int) Math.max(Math.min((long) this 
1524:                        .scale()
1525:                        - divisor.scale(), Integer.MAX_VALUE),
1526:                        Integer.MIN_VALUE);
1527:                if (this .signum() == 0) // 0/y
1528:                    return new BigDecimal(0, preferredScale);
1529:                else {
1530:                    this .inflate();
1531:                    divisor.inflate();
1532:                    /*
1533:                     * If the quotient this/divisor has a terminating decimal
1534:                     * expansion, the expansion can have no more than
1535:                     * (a.precision() + ceil(10*b.precision)/3) digits.
1536:                     * Therefore, create a MathContext object with this
1537:                     * precision and do a divide with the UNNECESSARY rounding
1538:                     * mode.
1539:                     */
1540:                    MathContext mc = new MathContext((int) Math.min(this 
1541:                            .precision()
1542:                            + (long) Math
1543:                                    .ceil(10.0 * divisor.precision() / 3.0),
1544:                            Integer.MAX_VALUE), RoundingMode.UNNECESSARY);
1545:                    BigDecimal quotient;
1546:                    try {
1547:                        quotient = this .divide(divisor, mc);
1548:                    } catch (ArithmeticException e) {
1549:                        throw new ArithmeticException(
1550:                                "Non-terminating decimal expansion; "
1551:                                        + "no exact representable decimal result.");
1552:                    }
1553:
1554:                    int quotientScale = quotient.scale();
1555:
1556:                    // divide(BigDecimal, mc) tries to adjust the quotient to
1557:                    // the desired one by removing trailing zeros; since the
1558:                    // exact divide method does not have an explicit digit
1559:                    // limit, we can add zeros too.
1560:
1561:                    if (preferredScale > quotientScale)
1562:                        return quotient.setScale(preferredScale);
1563:
1564:                    return quotient;
1565:                }
1566:            }
1567:
1568:            /**
1569:             * Returns a {@code BigDecimal} whose value is {@code (this /
1570:             * divisor)}, with rounding according to the context settings.
1571:             *
1572:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1573:             * @param  mc the context to use.
1574:             * @return {@code this / divisor}, rounded as necessary.
1575:             * @throws ArithmeticException if the result is inexact but the
1576:             *         rounding mode is {@code UNNECESSARY} or 
1577:             *         {@code mc.precision == 0} and the quotient has a 
1578:             *         non-terminating decimal expansion.
1579:             * @since  1.5
1580:             */
1581:            public BigDecimal divide(BigDecimal divisor, MathContext mc) {
1582:                if (mc.precision == 0)
1583:                    return divide(divisor);
1584:                BigDecimal lhs = this .inflate(); // left-hand-side
1585:                BigDecimal rhs = divisor.inflate(); // right-hand-side
1586:                BigDecimal result; // work
1587:
1588:                long preferredScale = (long) lhs.scale() - rhs.scale();
1589:
1590:                // Now calculate the answer.  We use the existing
1591:                // divide-and-round method, but as this rounds to scale we have
1592:                // to normalize the values here to achieve the desired result.
1593:                // For x/y we first handle y=0 and x=0, and then normalize x and
1594:                // y to give x' and y' with the following constraints:
1595:                //   (a) 0.1 <= x' < 1
1596:                //   (b)  x' <= y' < 10*x'
1597:                // Dividing x'/y' with the required scale set to mc.precision then
1598:                // will give a result in the range 0.1 to 1 rounded to exactly
1599:                // the right number of digits (except in the case of a result of
1600:                // 1.000... which can arise when x=y, or when rounding overflows
1601:                // The 1.000... case will reduce properly to 1.
1602:                if (rhs.signum() == 0) { // x/0
1603:                    if (lhs.signum() == 0) // 0/0
1604:                        throw new ArithmeticException("Division undefined"); // NaN
1605:                    throw new ArithmeticException("Division by zero");
1606:                }
1607:                if (lhs.signum() == 0) // 0/y
1608:                    return new BigDecimal(BigInteger.ZERO, (int) Math.max(Math
1609:                            .min(preferredScale, Integer.MAX_VALUE),
1610:                            Integer.MIN_VALUE));
1611:
1612:                BigDecimal xprime = new BigDecimal(lhs.intVal.abs(), lhs
1613:                        .precision());
1614:                BigDecimal yprime = new BigDecimal(rhs.intVal.abs(), rhs
1615:                        .precision());
1616:                // xprime and yprime are now both in range 0.1 through 0.999...
1617:                if (mc.roundingMode == RoundingMode.CEILING
1618:                        || mc.roundingMode == RoundingMode.FLOOR) {
1619:                    // The floor (round toward negative infinity) and ceil
1620:                    // (round toward positive infinity) rounding modes are not
1621:                    // invariant under a sign flip.  If xprime/yprime has a
1622:                    // different sign than lhs/rhs, the rounding mode must be
1623:                    // changed.
1624:                    if ((xprime.signum() != lhs.signum())
1625:                            ^ (yprime.signum() != rhs.signum())) {
1626:                        mc = new MathContext(
1627:                                mc.precision,
1628:                                (mc.roundingMode == RoundingMode.CEILING) ? RoundingMode.FLOOR
1629:                                        : RoundingMode.CEILING);
1630:                    }
1631:                }
1632:
1633:                if (xprime.compareTo(yprime) > 0) // satisfy constraint (b)
1634:                    yprime.scale -= 1; // [that is, yprime *= 10]
1635:                result = xprime.divide(yprime, mc.precision,
1636:                        mc.roundingMode.oldMode);
1637:                // correct the scale of the result...
1638:                result.scale = checkScale((long) yprime.scale - xprime.scale
1639:                        - (rhs.scale - lhs.scale) + mc.precision);
1640:                // apply the sign
1641:                if (lhs.signum() != rhs.signum())
1642:                    result = result.negate();
1643:                // doRound, here, only affects 1000000000 case.
1644:                result = result.doRound(mc);
1645:
1646:                if (result.multiply(divisor).compareTo(this ) == 0) {
1647:                    // Apply preferred scale rules for exact quotients
1648:                    return result.stripZerosToMatchScale(preferredScale);
1649:                } else {
1650:                    return result;
1651:                }
1652:            }
1653:
1654:            /**
1655:             * Returns a {@code BigDecimal} whose value is the integer part
1656:             * of the quotient {@code (this / divisor)} rounded down.  The
1657:             * preferred scale of the result is {@code (this.scale() -
1658:             * divisor.scale())}.
1659:             *
1660:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1661:             * @return The integer part of {@code this / divisor}.
1662:             * @throws ArithmeticException if {@code divisor==0}
1663:             * @since  1.5
1664:             */
1665:            public BigDecimal divideToIntegralValue(BigDecimal divisor) {
1666:                // Calculate preferred scale
1667:                int preferredScale = (int) Math.max(Math.min((long) this 
1668:                        .scale()
1669:                        - divisor.scale(), Integer.MAX_VALUE),
1670:                        Integer.MIN_VALUE);
1671:                this .inflate();
1672:                divisor.inflate();
1673:                if (this .abs().compareTo(divisor.abs()) < 0) {
1674:                    // much faster when this << divisor
1675:                    return BigDecimal.valueOf(0, preferredScale);
1676:                }
1677:
1678:                if (this .signum() == 0 && divisor.signum() != 0)
1679:                    return this .setScale(preferredScale);
1680:
1681:                // Perform a divide with enough digits to round to a correct
1682:                // integer value; then remove any fractional digits
1683:
1684:                int maxDigits = (int) Math.min(this .precision()
1685:                        + (long) Math.ceil(10.0 * divisor.precision() / 3.0)
1686:                        + Math.abs((long) this .scale() - divisor.scale()) + 2,
1687:                        Integer.MAX_VALUE);
1688:
1689:                BigDecimal quotient = this .divide(divisor, new MathContext(
1690:                        maxDigits, RoundingMode.DOWN));
1691:                if (quotient.scale > 0) {
1692:                    quotient = quotient.setScale(0, RoundingMode.DOWN)
1693:                            .stripZerosToMatchScale(preferredScale);
1694:                }
1695:
1696:                if (quotient.scale < preferredScale) {
1697:                    // pad with zeros if necessary
1698:                    quotient = quotient.setScale(preferredScale);
1699:                }
1700:
1701:                return quotient;
1702:            }
1703:
1704:            /**
1705:             * Returns a {@code BigDecimal} whose value is the integer part
1706:             * of {@code (this / divisor)}.  Since the integer part of the
1707:             * exact quotient does not depend on the rounding mode, the
1708:             * rounding mode does not affect the values returned by this
1709:             * method.  The preferred scale of the result is
1710:             * {@code (this.scale() - divisor.scale())}.  An
1711:             * {@code ArithmeticException} is thrown if the integer part of
1712:             * the exact quotient needs more than {@code mc.precision}
1713:             * digits.
1714:             *
1715:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1716:             * @param  mc the context to use.
1717:             * @return The integer part of {@code this / divisor}.
1718:             * @throws ArithmeticException if {@code divisor==0}
1719:             * @throws ArithmeticException if {@code mc.precision} {@literal >} 0 and the result
1720:             *         requires a precision of more than {@code mc.precision} digits.
1721:             * @since  1.5
1722:             * @author Joseph D. Darcy
1723:             */
1724:            public BigDecimal divideToIntegralValue(BigDecimal divisor,
1725:                    MathContext mc) {
1726:                if (mc.precision == 0 || // exact result
1727:                        (this .abs().compareTo(divisor.abs()) < 0)) // zero result
1728:                    return divideToIntegralValue(divisor);
1729:
1730:                // Calculate preferred scale
1731:                int preferredScale = (int) Math.max(Math.min((long) this 
1732:                        .scale()
1733:                        - divisor.scale(), Integer.MAX_VALUE),
1734:                        Integer.MIN_VALUE);
1735:
1736:                /*
1737:                 * Perform a normal divide to mc.precision digits.  If the
1738:                 * remainder has absolute value less than the divisor, the
1739:                 * integer portion of the quotient fits into mc.precision
1740:                 * digits.  Next, remove any fractional digits from the
1741:                 * quotient and adjust the scale to the preferred value.
1742:                 */
1743:                BigDecimal result = this .divide(divisor, new MathContext(
1744:                        mc.precision, RoundingMode.DOWN));
1745:                int resultScale = result.scale();
1746:
1747:                if (result.scale() < 0) {
1748:                    /*
1749:                     * Result is an integer. See if quotient represents the
1750:                     * full integer portion of the exact quotient; if it does,
1751:                     * the computed remainder will be less than the divisor.
1752:                     */
1753:                    BigDecimal product = result.multiply(divisor);
1754:                    // If the quotient is the full integer value,
1755:                    // |dividend-product| < |divisor|.
1756:                    if (this .subtract(product).abs().compareTo(divisor.abs()) >= 0) {
1757:                        throw new ArithmeticException("Division impossible");
1758:                    }
1759:                } else if (result.scale() > 0) {
1760:                    /*
1761:                     * Integer portion of quotient will fit into precision
1762:                     * digits; recompute quotient to scale 0 to avoid double
1763:                     * rounding and then try to adjust, if necessary.
1764:                     */
1765:                    result = result.setScale(0, RoundingMode.DOWN);
1766:                }
1767:                // else result.scale() == 0; 
1768:
1769:                int precisionDiff;
1770:                if ((preferredScale > result.scale())
1771:                        && (precisionDiff = mc.precision - result.precision()) > 0) {
1772:                    return result.setScale(result.scale()
1773:                            + Math.min(precisionDiff, preferredScale
1774:                                    - result.scale));
1775:                } else
1776:                    return result.stripZerosToMatchScale(preferredScale);
1777:            }
1778:
1779:            /**
1780:             * Returns a {@code BigDecimal} whose value is {@code (this % divisor)}.
1781:             * 
1782:             * <p>The remainder is given by
1783:             * {@code this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))}.
1784:             * Note that this is not the modulo operation (the result can be
1785:             * negative).
1786:             *
1787:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1788:             * @return {@code this % divisor}.
1789:             * @throws ArithmeticException if {@code divisor==0}
1790:             * @since  1.5
1791:             */
1792:            public BigDecimal remainder(BigDecimal divisor) {
1793:                BigDecimal divrem[] = this .divideAndRemainder(divisor);
1794:                return divrem[1];
1795:            }
1796:
1797:            /**
1798:             * Returns a {@code BigDecimal} whose value is {@code (this %
1799:             * divisor)}, with rounding according to the context settings.
1800:             * The {@code MathContext} settings affect the implicit divide
1801:             * used to compute the remainder.  The remainder computation
1802:             * itself is by definition exact.  Therefore, the remainder may
1803:             * contain more than {@code mc.getPrecision()} digits.
1804:             * 
1805:             * <p>The remainder is given by
1806:             * {@code this.subtract(this.divideToIntegralValue(divisor,
1807:             * mc).multiply(divisor))}.  Note that this is not the modulo
1808:             * operation (the result can be negative).
1809:             *
1810:             * @param  divisor value by which this {@code BigDecimal} is to be divided.
1811:             * @param  mc the context to use.
1812:             * @return {@code this % divisor}, rounded as necessary.
1813:             * @throws ArithmeticException if {@code divisor==0}
1814:             * @throws ArithmeticException if the result is inexact but the
1815:             *         rounding mode is {@code UNNECESSARY}, or {@code mc.precision} 
1816:             *         {@literal >} 0 and the result of {@code this.divideToIntgralValue(divisor)} would 
1817:             *         require a precision of more than {@code mc.precision} digits.
1818:             * @see    #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1819:             * @since  1.5
1820:             */
1821:            public BigDecimal remainder(BigDecimal divisor, MathContext mc) {
1822:                BigDecimal divrem[] = this .divideAndRemainder(divisor, mc);
1823:                return divrem[1];
1824:            }
1825:
1826:            /**
1827:             * Returns a two-element {@code BigDecimal} array containing the
1828:             * result of {@code divideToIntegralValue} followed by the result of
1829:             * {@code remainder} on the two operands.
1830:             * 
1831:             * <p>Note that if both the integer quotient and remainder are
1832:             * needed, this method is faster than using the
1833:             * {@code divideToIntegralValue} and {@code remainder} methods
1834:             * separately because the division need only be carried out once.
1835:             *
1836:             * @param  divisor value by which this {@code BigDecimal} is to be divided, 
1837:             *         and the remainder computed.
1838:             * @return a two element {@code BigDecimal} array: the quotient 
1839:             *         (the result of {@code divideToIntegralValue}) is the initial element 
1840:             *         and the remainder is the final element.
1841:             * @throws ArithmeticException if {@code divisor==0}
1842:             * @see    #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1843:             * @see    #remainder(java.math.BigDecimal, java.math.MathContext)
1844:             * @since  1.5
1845:             */
1846:            public BigDecimal[] divideAndRemainder(BigDecimal divisor) {
1847:                // we use the identity  x = i * y + r to determine r
1848:                BigDecimal[] result = new BigDecimal[2];
1849:
1850:                result[0] = this .divideToIntegralValue(divisor);
1851:                result[1] = this .subtract(result[0].multiply(divisor));
1852:                return result;
1853:            }
1854:
1855:            /**
1856:             * Returns a two-element {@code BigDecimal} array containing the
1857:             * result of {@code divideToIntegralValue} followed by the result of
1858:             * {@code remainder} on the two operands calculated with rounding
1859:             * according to the context settings.
1860:             * 
1861:             * <p>Note that if both the integer quotient and remainder are
1862:             * needed, this method is faster than using the
1863:             * {@code divideToIntegralValue} and {@code remainder} methods
1864:             * separately because the division need only be carried out once.
1865:             *
1866:             * @param  divisor value by which this {@code BigDecimal} is to be divided, 
1867:             *         and the remainder computed.
1868:             * @param  mc the context to use.
1869:             * @return a two element {@code BigDecimal} array: the quotient 
1870:             *         (the result of {@code divideToIntegralValue}) is the 
1871:             *         initial element and the remainder is the final element.
1872:             * @throws ArithmeticException if {@code divisor==0}
1873:             * @throws ArithmeticException if the result is inexact but the
1874:             *         rounding mode is {@code UNNECESSARY}, or {@code mc.precision} 
1875:             *         {@literal >} 0 and the result of {@code this.divideToIntgralValue(divisor)} would 
1876:             *         require a precision of more than {@code mc.precision} digits.
1877:             * @see    #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1878:             * @see    #remainder(java.math.BigDecimal, java.math.MathContext)
1879:             * @since  1.5
1880:             */
1881:            public BigDecimal[] divideAndRemainder(BigDecimal divisor,
1882:                    MathContext mc) {
1883:                if (mc.precision == 0)
1884:                    return divideAndRemainder(divisor);
1885:
1886:                BigDecimal[] result = new BigDecimal[2];
1887:                BigDecimal lhs = this ;
1888:
1889:                result[0] = lhs.divideToIntegralValue(divisor, mc);
1890:                result[1] = lhs.subtract(result[0].multiply(divisor));
1891:                return result;
1892:            }
1893:
1894:            /**
1895:             * Returns a {@code BigDecimal} whose value is
1896:             * <tt>(this<sup>n</sup>)</tt>, The power is computed exactly, to
1897:             * unlimited precision.
1898:             * 
1899:             * <p>The parameter {@code n} must be in the range 0 through
1900:             * 999999999, inclusive.  {@code ZERO.pow(0)} returns {@link
1901:             * #ONE}.
1902:             *
1903:             * Note that future releases may expand the allowable exponent
1904:             * range of this method.
1905:             *
1906:             * @param  n power to raise this {@code BigDecimal} to.
1907:             * @return <tt>this<sup>n</sup></tt>
1908:             * @throws ArithmeticException if {@code n} is out of range.
1909:             * @since  1.5
1910:             */
1911:            public BigDecimal pow(int n) {
1912:                if (n < 0 || n > 999999999)
1913:                    throw new ArithmeticException("Invalid operation");
1914:                // No need to calculate pow(n) if result will over/underflow.
1915:                // Don't attempt to support "supernormal" numbers.
1916:                int newScale = checkScale((long) scale * n);
1917:                this .inflate();
1918:                return new BigDecimal(intVal.pow(n), newScale);
1919:            }
1920:
1921:            /**
1922:             * Returns a {@code BigDecimal} whose value is
1923:             * <tt>(this<sup>n</sup>)</tt>.  The current implementation uses
1924:             * the core algorithm defined in ANSI standard X3.274-1996 with
1925:             * rounding according to the context settings.  In general, the
1926:             * returned numerical value is within two ulps of the exact
1927:             * numerical value for the chosen precision.  Note that future
1928:             * releases may use a different algorithm with a decreased
1929:             * allowable error bound and increased allowable exponent range.
1930:             *
1931:             * <p>The X3.274-1996 algorithm is:
1932:             *
1933:             * <ul>
1934:             * <li> An {@code ArithmeticException} exception is thrown if
1935:             *  <ul>
1936:             *    <li>{@code abs(n) > 999999999}
1937:             *    <li>{@code mc.precision == 0} and {@code n < 0}
1938:             *    <li>{@code mc.precision > 0} and {@code n} has more than
1939:             *    {@code mc.precision} decimal digits
1940:             *  </ul>
1941:             *
1942:             * <li> if {@code n} is zero, {@link #ONE} is returned even if
1943:             * {@code this} is zero, otherwise
1944:             * <ul>
1945:             *   <li> if {@code n} is positive, the result is calculated via
1946:             *   the repeated squaring technique into a single accumulator.
1947:             *   The individual multiplications with the accumulator use the
1948:             *   same math context settings as in {@code mc} except for a
1949:             *   precision increased to {@code mc.precision + elength + 1}
1950:             *   where {@code elength} is the number of decimal digits in
1951:             *   {@code n}.
1952:             *
1953:             *   <li> if {@code n} is negative, the result is calculated as if
1954:             *   {@code n} were positive; this value is then divided into one
1955:             *   using the working precision specified above.
1956:             *
1957:             *   <li> The final value from either the positive or negative case
1958:             *   is then rounded to the destination precision.
1959:             *   </ul>
1960:             * </ul>
1961:             *
1962:             * @param  n power to raise this {@code BigDecimal} to.
1963:             * @param  mc the context to use.
1964:             * @return <tt>this<sup>n</sup></tt> using the ANSI standard X3.274-1996
1965:             *         algorithm
1966:             * @throws ArithmeticException if the result is inexact but the
1967:             *         rounding mode is {@code UNNECESSARY}, or {@code n} is out 
1968:             *         of range.
1969:             * @since  1.5
1970:             */
1971:            public BigDecimal pow(int n, MathContext mc) {
1972:                if (mc.precision == 0)
1973:                    return pow(n);
1974:                if (n < -999999999 || n > 999999999)
1975:                    throw new ArithmeticException("Invalid operation");
1976:                if (n == 0)
1977:                    return ONE; // x**0 == 1 in X3.274
1978:                this .inflate();
1979:                BigDecimal lhs = this ;
1980:                MathContext workmc = mc; // working settings
1981:                int mag = Math.abs(n); // magnitude of n
1982:                if (mc.precision > 0) {
1983:
1984:                    int elength = intLength(mag); // length of n in digits
1985:                    if (elength > mc.precision) // X3.274 rule
1986:                        throw new ArithmeticException("Invalid operation");
1987:                    workmc = new MathContext(mc.precision + elength + 1,
1988:                            mc.roundingMode);
1989:                }
1990:                // ready to carry out power calculation...
1991:                BigDecimal acc = ONE; // accumulator
1992:                boolean seenbit = false; // set once we've seen a 1-bit
1993:                for (int i = 1;; i++) { // for each bit [top bit ignored]
1994:                    mag += mag; // shift left 1 bit
1995:                    if (mag < 0) { // top bit is set
1996:                        seenbit = true; // OK, we're off
1997:                        acc = acc.multiply(lhs, workmc); // acc=acc*x
1998:                    }
1999:                    if (i == 31)
2000:                        break; // that was the last bit
2001:                    if (seenbit)
2002:                        acc = acc.multiply(acc, workmc); // acc=acc*acc [square]
2003:                    // else (!seenbit) no point in squaring ONE
2004:                }
2005:                // if negative n, calculate the reciprocal using working precision
2006:                if (n < 0) // [hence mc.precision>0]
2007:                    acc = ONE.divide(acc, workmc);
2008:                // round to final precision and strip zeros
2009:                return acc.doRound(mc);
2010:            }
2011:
2012:            /**
2013:             * Returns a {@code BigDecimal} whose value is the absolute value
2014:             * of this {@code BigDecimal}, and whose scale is
2015:             * {@code this.scale()}.
2016:             *
2017:             * @return {@code abs(this)}
2018:             */
2019:            public BigDecimal abs() {
2020:                return (signum() < 0 ? negate() : this );
2021:            }
2022:
2023:            /**
2024:             * Returns a {@code BigDecimal} whose value is the absolute value
2025:             * of this {@code BigDecimal}, with rounding according to the
2026:             * context settings.
2027:             *
2028:             * @param mc the context to use.
2029:             * @return {@code abs(this)}, rounded as necessary.
2030:             * @throws ArithmeticException if the result is inexact but the
2031:             *         rounding mode is {@code UNNECESSARY}.
2032:             * @since 1.5
2033:             */
2034:            public BigDecimal abs(MathContext mc) {
2035:                return (signum() < 0 ? negate(mc) : plus(mc));
2036:            }
2037:
2038:            /**
2039:             * Returns a {@code BigDecimal} whose value is {@code (-this)},
2040:             * and whose scale is {@code this.scale()}.
2041:             *
2042:             * @return {@code -this}.
2043:             */
2044:            public BigDecimal negate() {
2045:                BigDecimal result;
2046:                if (intCompact != INFLATED)
2047:                    result = BigDecimal.valueOf(-intCompact, scale);
2048:                else {
2049:                    result = new BigDecimal(intVal.negate(), scale);
2050:                    result.precision = precision;
2051:                }
2052:                return result;
2053:            }
2054:
2055:            /**
2056:             * Returns a {@code BigDecimal} whose value is {@code (-this)},
2057:             * with rounding according to the context settings.
2058:             *
2059:             * @param mc the context to use.
2060:             * @return {@code -this}, rounded as necessary.
2061:             * @throws ArithmeticException if the result is inexact but the 
2062:             *         rounding mode is {@code UNNECESSARY}.
2063:             * @since  1.5
2064:             */
2065:            public BigDecimal negate(MathContext mc) {
2066:                return negate().plus(mc);
2067:            }
2068:
2069:            /**
2070:             * Returns a {@code BigDecimal} whose value is {@code (+this)}, and whose
2071:             * scale is {@code this.scale()}.
2072:             * 
2073:             * <p>This method, which simply returns this {@code BigDecimal}
2074:             * is included for symmetry with the unary minus method {@link
2075:             * #negate()}.
2076:             * 
2077:             * @return {@code this}.
2078:             * @see #negate()
2079:             * @since  1.5
2080:             */
2081:            public BigDecimal plus() {
2082:                return this ;
2083:            }
2084:
2085:            /**
2086:             * Returns a {@code BigDecimal} whose value is {@code (+this)},
2087:             * with rounding according to the context settings.
2088:             * 
2089:             * <p>The effect of this method is identical to that of the {@link
2090:             * #round(MathContext)} method.
2091:             *
2092:             * @param mc the context to use.
2093:             * @return {@code this}, rounded as necessary.  A zero result will
2094:             *         have a scale of 0.
2095:             * @throws ArithmeticException if the result is inexact but the
2096:             *         rounding mode is {@code UNNECESSARY}.
2097:             * @see    #round(MathContext)
2098:             * @since  1.5
2099:             */
2100:            public BigDecimal plus(MathContext mc) {
2101:                if (mc.precision == 0) // no rounding please
2102:                    return this ;
2103:                return this .doRound(mc);
2104:            }
2105:
2106:            /**
2107:             * Returns the signum function of this {@code BigDecimal}.
2108:             *
2109:             * @return -1, 0, or 1 as the value of this {@code BigDecimal} 
2110:             *         is negative, zero, or positive.
2111:             */
2112:            public int signum() {
2113:                return (intCompact != INFLATED) ? Long.signum(intCompact)
2114:                        : intVal.signum();
2115:            }
2116:
2117:            /**
2118:             * Returns the <i>scale</i> of this {@code BigDecimal}.  If zero
2119:             * or positive, the scale is the number of digits to the right of
2120:             * the decimal point.  If negative, the unscaled value of the
2121:             * number is multiplied by ten to the power of the negation of the
2122:             * scale.  For example, a scale of {@code -3} means the unscaled
2123:             * value is multiplied by 1000.
2124:             *
2125:             * @return the scale of this {@code BigDecimal}.
2126:             */
2127:            public int scale() {
2128:                return scale;
2129:            }
2130:
2131:            /**
2132:             * Returns the <i>precision</i> of this {@code BigDecimal}.  (The
2133:             * precision is the number of digits in the unscaled value.)
2134:             *
2135:             * <p>The precision of a zero value is 1.
2136:             *
2137:             * @return the precision of this {@code BigDecimal}.
2138:             * @since  1.5
2139:             */
2140:            public int precision() {
2141:                int result = precision;
2142:                if (result == 0) {
2143:                    result = digitLength();
2144:                    precision = result;
2145:                }
2146:                return result;
2147:            }
2148:
2149:            /**
2150:             * Returns a {@code BigInteger} whose value is the <i>unscaled
2151:             * value</i> of this {@code BigDecimal}.  (Computes <tt>(this *
2152:             * 10<sup>this.scale()</sup>)</tt>.)
2153:             *
2154:             * @return the unscaled value of this {@code BigDecimal}.
2155:             * @since  1.2
2156:             */
2157:            public BigInteger unscaledValue() {
2158:                return this .inflate().intVal;
2159:            }
2160:
2161:            // Rounding Modes
2162:
2163:            /**
2164:             * Rounding mode to round away from zero.  Always increments the
2165:             * digit prior to a nonzero discarded fraction.  Note that this rounding
2166:             * mode never decreases the magnitude of the calculated value.
2167:             */
2168:            public final static int ROUND_UP = 0;
2169:
2170:            /**
2171:             * Rounding mode to round towards zero.  Never increments the digit
2172:             * prior to a discarded fraction (i.e., truncates).  Note that this
2173:             * rounding mode never increases the magnitude of the calculated value.
2174:             */
2175:            public final static int ROUND_DOWN = 1;
2176:
2177:            /**
2178:             * Rounding mode to round towards positive infinity.  If the
2179:             * {@code BigDecimal} is positive, behaves as for
2180:             * {@code ROUND_UP}; if negative, behaves as for
2181:             * {@code ROUND_DOWN}.  Note that this rounding mode never
2182:             * decreases the calculated value.
2183:             */
2184:            public final static int ROUND_CEILING = 2;
2185:
2186:            /**
2187:             * Rounding mode to round towards negative infinity.  If the
2188:             * {@code BigDecimal} is positive, behave as for
2189:             * {@code ROUND_DOWN}; if negative, behave as for
2190:             * {@code ROUND_UP}.  Note that this rounding mode never
2191:             * increases the calculated value.
2192:             */
2193:            public final static int ROUND_FLOOR = 3;
2194:
2195:            /**
2196:             * Rounding mode to round towards {@literal "nearest neighbor"}
2197:             * unless both neighbors are equidistant, in which case round up.
2198:             * Behaves as for {@code ROUND_UP} if the discarded fraction is
2199:             * &ge; 0.5; otherwise, behaves as for {@code ROUND_DOWN}.  Note
2200:             * that this is the rounding mode that most of us were taught in
2201:             * grade school.
2202:             */
2203:            public final static int ROUND_HALF_UP = 4;
2204:
2205:            /**
2206:             * Rounding mode to round towards {@literal "nearest neighbor"}
2207:             * unless both neighbors are equidistant, in which case round
2208:             * down.  Behaves as for {@code ROUND_UP} if the discarded
2209:             * fraction is {@literal >} 0.5; otherwise, behaves as for
2210:             * {@code ROUND_DOWN}.
2211:             */
2212:            public final static int ROUND_HALF_DOWN = 5;
2213:
2214:            /**
2215:             * Rounding mode to round towards the {@literal "nearest neighbor"}
2216:             * unless both neighbors are equidistant, in which case, round
2217:             * towards the even neighbor.  Behaves as for
2218:             * {@code ROUND_HALF_UP} if the digit to the left of the
2219:             * discarded fraction is odd; behaves as for
2220:             * {@code ROUND_HALF_DOWN} if it's even.  Note that this is the
2221:             * rounding mode that minimizes cumulative error when applied
2222:             * repeatedly over a sequence of calculations.
2223:             */
2224:            public final static int ROUND_HALF_EVEN = 6;
2225:
2226:            /**
2227:             * Rounding mode to assert that the requested operation has an exact
2228:             * result, hence no rounding is necessary.  If this rounding mode is
2229:             * specified on an operation that yields an inexact result, an
2230:             * {@code ArithmeticException} is thrown.
2231:             */
2232:            public final static int ROUND_UNNECESSARY = 7;
2233:
2234:            // Scaling/Rounding Operations
2235:
2236:            /**
2237:             * Returns a {@code BigDecimal} rounded according to the
2238:             * {@code MathContext} settings.  If the precision setting is 0 then
2239:             * no rounding takes place.
2240:             * 
2241:             * <p>The effect of this method is identical to that of the
2242:             * {@link #plus(MathContext)} method.
2243:             *
2244:             * @param mc the context to use.
2245:             * @return a {@code BigDecimal} rounded according to the 
2246:             *         {@code MathContext} settings.
2247:             * @throws ArithmeticException if the rounding mode is
2248:             *         {@code UNNECESSARY} and the
2249:             *         {@code BigDecimal}  operation would require rounding.
2250:             * @see    #plus(MathContext)
2251:             * @since  1.5
2252:             */
2253:            public BigDecimal round(MathContext mc) {
2254:                return plus(mc);
2255:            }
2256:
2257:            /**
2258:             * Returns a {@code BigDecimal} whose scale is the specified
2259:             * value, and whose unscaled value is determined by multiplying or
2260:             * dividing this {@code BigDecimal}'s unscaled value by the
2261:             * appropriate power of ten to maintain its overall value.  If the
2262:             * scale is reduced by the operation, the unscaled value must be
2263:             * divided (rather than multiplied), and the value may be changed;
2264:             * in this case, the specified rounding mode is applied to the
2265:             * division.
2266:             *
2267:             * <p>Note that since BigDecimal objects are immutable, calls of
2268:             * this method do <i>not</i> result in the original object being
2269:             * modified, contrary to the usual convention of having methods
2270:             * named <tt>set<i>X</i></tt> mutate field <i>{@code X}</i>.
2271:             * Instead, {@code setScale} returns an object with the proper
2272:             * scale; the returned object may or may not be newly allocated.
2273:             * 
2274:             * @param  newScale scale of the {@code BigDecimal} value to be returned.
2275:             * @param  roundingMode The rounding mode to apply.
2276:             * @return a {@code BigDecimal} whose scale is the specified value, 
2277:             *         and whose unscaled value is determined by multiplying or 
2278:             *         dividing this {@code BigDecimal}'s unscaled value by the 
2279:             *         appropriate power of ten to maintain its overall value.
2280:             * @throws ArithmeticException if {@code roundingMode==UNNECESSARY}
2281:             *         and the specified scaling operation would require
2282:             *         rounding.
2283:             * @see    RoundingMode
2284:             * @since  1.5
2285:             */
2286:            public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
2287:                return setScale(newScale, roundingMode.oldMode);
2288:            }
2289:
2290:            /**
2291:             * Returns a {@code BigDecimal} whose scale is the specified
2292:             * value, and whose unscaled value is determined by multiplying or
2293:             * dividing this {@code BigDecimal}'s unscaled value by the
2294:             * appropriate power of ten to maintain its overall value.  If the
2295:             * scale is reduced by the operation, the unscaled value must be
2296:             * divided (rather than multiplied), and the value may be changed;
2297:             * in this case, the specified rounding mode is applied to the
2298:             * division.
2299:             * 
2300:             * <p>Note that since BigDecimal objects are immutable, calls of
2301:             * this method do <i>not</i> result in the original object being
2302:             * modified, contrary to the usual convention of having methods
2303:             * named <tt>set<i>X</i></tt> mutate field <i>{@code X}</i>.
2304:             * Instead, {@code setScale} returns an object with the proper
2305:             * scale; the returned object may or may not be newly allocated.
2306:             * 
2307:             * <p>The new {@link #setScale(int, RoundingMode)} method should
2308:             * be used in preference to this legacy method.
2309:             * 
2310:             * @param  newScale scale of the {@code BigDecimal} value to be returned.
2311:             * @param  roundingMode The rounding mode to apply.
2312:             * @return a {@code BigDecimal} whose scale is the specified value, 
2313:             *         and whose unscaled value is determined by multiplying or 
2314:             *         dividing this {@code BigDecimal}'s unscaled value by the 
2315:             *         appropriate power of ten to maintain its overall value.
2316:             * @throws ArithmeticException if {@code roundingMode==ROUND_UNNECESSARY}
2317:             *         and the specified scaling operation would require
2318:             *         rounding.
2319:             * @throws IllegalArgumentException if {@code roundingMode} does not
2320:             *         represent a valid rounding mode.
2321:             * @see    #ROUND_UP
2322:             * @see    #ROUND_DOWN
2323:             * @see    #ROUND_CEILING
2324:             * @see    #ROUND_FLOOR
2325:             * @see    #ROUND_HALF_UP
2326:             * @see    #ROUND_HALF_DOWN
2327:             * @see    #ROUND_HALF_EVEN
2328:             * @see    #ROUND_UNNECESSARY
2329:             */
2330:            public BigDecimal setScale(int newScale, int roundingMode) {
2331:                if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
2332:                    throw new IllegalArgumentException("Invalid rounding mode");
2333:
2334:                if (newScale == this .scale) // easy case
2335:                    return this ;
2336:                if (this .signum() == 0) // zero can have any scale
2337:                    return BigDecimal.valueOf(0, newScale);
2338:                if (newScale > this .scale) {
2339:                    // [we can use checkScale to assure multiplier is valid]
2340:                    int raise = checkScale((long) newScale - this .scale);
2341:
2342:                    if (intCompact != INFLATED) {
2343:                        long scaledResult = longTenToThe(intCompact, raise);
2344:                        if (scaledResult != INFLATED)
2345:                            return BigDecimal.valueOf(scaledResult, newScale);
2346:                        this .inflate();
2347:                    }
2348:
2349:                    BigDecimal result = new BigDecimal(intVal
2350:                            .multiply(tenToThe(raise)), newScale);
2351:                    if (this .precision > 0)
2352:                        result.precision = this .precision + newScale
2353:                                - this .scale;
2354:                    return result;
2355:                }
2356:                // scale < this.scale
2357:                // we cannot perfectly predict the precision after rounding
2358:                return divide(ONE, newScale, roundingMode);
2359:            }
2360:
2361:            /**
2362:             * Returns a {@code BigDecimal} whose scale is the specified
2363:             * value, and whose value is numerically equal to this
2364:             * {@code BigDecimal}'s.  Throws an {@code ArithmeticException}
2365:             * if this is not possible.
2366:             * 
2367:             * <p>This call is typically used to increase the scale, in which
2368:             * case it is guaranteed that there exists a {@code BigDecimal}
2369:             * of the specified scale and the correct value.  The call can
2370:             * also be used to reduce the scale if the caller knows that the
2371:             * {@code BigDecimal} has sufficiently many zeros at the end of
2372:             * its fractional part (i.e., factors of ten in its integer value)
2373:             * to allow for the rescaling without changing its value.
2374:             * 
2375:             * <p>This method returns the same result as the two-argument
2376:             * versions of {@code setScale}, but saves the caller the trouble
2377:             * of specifying a rounding mode in cases where it is irrelevant.
2378:             * 
2379:             * <p>Note that since {@code BigDecimal} objects are immutable,
2380:             * calls of this method do <i>not</i> result in the original
2381:             * object being modified, contrary to the usual convention of
2382:             * having methods named <tt>set<i>X</i></tt> mutate field
2383:             * <i>{@code X}</i>.  Instead, {@code setScale} returns an
2384:             * object with the proper scale; the returned object may or may
2385:             * not be newly allocated.
2386:             *
2387:             * @param  newScale scale of the {@code BigDecimal} value to be returned.
2388:             * @return a {@code BigDecimal} whose scale is the specified value, and 
2389:             *         whose unscaled value is determined by multiplying or dividing 
2390:             *         this {@code BigDecimal}'s unscaled value by the appropriate 
2391:             *         power of ten to maintain its overall value.
2392:             * @throws ArithmeticException if the specified scaling operation would
2393:             *         require rounding.
2394:             * @see    #setScale(int, int)
2395:             * @see    #setScale(int, RoundingMode)
2396:             */
2397:            public BigDecimal setScale(int newScale) {
2398:                return setScale(newScale, ROUND_UNNECESSARY);
2399:            }
2400:
2401:            // Decimal Point Motion Operations
2402:
2403:            /**
2404:             * Returns a {@code BigDecimal} which is equivalent to this one
2405:             * with the decimal point moved {@code n} places to the left.  If
2406:             * {@code n} is non-negative, the call merely adds {@code n} to
2407:             * the scale.  If {@code n} is negative, the call is equivalent
2408:             * to {@code movePointRight(-n)}.  The {@code BigDecimal}
2409:             * returned by this call has value <tt>(this &times;
2410:             * 10<sup>-n</sup>)</tt> and scale {@code max(this.scale()+n,
2411:             * 0)}.
2412:             *
2413:             * @param  n number of places to move the decimal point to the left.
2414:             * @return a {@code BigDecimal} which is equivalent to this one with the 
2415:             *         decimal point moved {@code n} places to the left.
2416:             * @throws ArithmeticException if scale overflows.
2417:             */
2418:            public BigDecimal movePointLeft(int n) {
2419:                // Cannot use movePointRight(-n) in case of n==Integer.MIN_VALUE
2420:                int newScale = checkScale((long) scale + n);
2421:                BigDecimal num;
2422:                if (intCompact != INFLATED)
2423:                    num = BigDecimal.valueOf(intCompact, newScale);
2424:                else
2425:                    num = new BigDecimal(intVal, newScale);
2426:                return (num.scale < 0 ? num.setScale(0) : num);
2427:            }
2428:
2429:            /**
2430:             * Returns a {@code BigDecimal} which is equivalent to this one
2431:             * with the decimal point moved {@code n} places to the right.
2432:             * If {@code n} is non-negative, the call merely subtracts
2433:             * {@code n} from the scale.  If {@code n} is negative, the call
2434:             * is equivalent to {@code movePointLeft(-n)}.  The
2435:             * {@code BigDecimal} returned by this call has value <tt>(this
2436:             * &times; 10<sup>n</sup>)</tt> and scale {@code max(this.scale()-n,
2437:             * 0)}.
2438:             *
2439:             * @param  n number of places to move the decimal point to the right.
2440:             * @return a {@code BigDecimal} which is equivalent to this one
2441:             *         with the decimal point moved {@code n} places to the right.
2442:             * @throws ArithmeticException if scale overflows.
2443:             */
2444:            public BigDecimal movePointRight(int n) {
2445:                // Cannot use movePointLeft(-n) in case of n==Integer.MIN_VALUE
2446:                int newScale = checkScale((long) scale - n);
2447:                BigDecimal num;
2448:                if (intCompact != INFLATED)
2449:                    num = BigDecimal.valueOf(intCompact, newScale);
2450:                else
2451:                    num = new BigDecimal(intVal, newScale);
2452:                return (num.scale < 0 ? num.setScale(0) : num);
2453:            }
2454:
2455:            /**
2456:             * Returns a BigDecimal whose numerical value is equal to
2457:             * ({@code this} * 10<sup>n</sup>).  The scale of
2458:             * the result is {@code (this.scale() - n)}.
2459:             *
2460:             * @throws ArithmeticException if the scale would be
2461:             *         outside the range of a 32-bit integer.
2462:             *
2463:             * @since 1.5
2464:             */
2465:            public BigDecimal scaleByPowerOfTen(int n) {
2466:                this .inflate();
2467:                BigDecimal num = new BigDecimal(intVal, checkScale((long) scale
2468:                        - n));
2469:                num.precision = precision;
2470:                return num;
2471:            }
2472:
2473:            /**
2474:             * Returns a {@code BigDecimal} which is numerically equal to
2475:             * this one but with any trailing zeros removed from the
2476:             * representation.  For example, stripping the trailing zeros from
2477:             * the {@code BigDecimal} value {@code 600.0}, which has
2478:             * [{@code BigInteger}, {@code scale}] components equals to
2479:             * [6000, 1], yields {@code 6E2} with [{@code BigInteger},
2480:             * {@code scale}] components equals to [6, -2]
2481:             *
2482:             * @return a numerically equal {@code BigDecimal} with any
2483:             * trailing zeros removed.
2484:             * @since 1.5
2485:             */
2486:            public BigDecimal stripTrailingZeros() {
2487:                this .inflate();
2488:                return (new BigDecimal(intVal, scale))
2489:                        .stripZerosToMatchScale(Long.MIN_VALUE);
2490:            }
2491:
2492:            // Comparison Operations
2493:
2494:            /**
2495:             * Compares this {@code BigDecimal} with the specified
2496:             * {@code BigDecimal}.  Two {@code BigDecimal} objects that are
2497:             * equal in value but have a different scale (like 2.0 and 2.00)
2498:             * are considered equal by this method.  This method is provided
2499:             * in preference to individual methods for each of the six boolean
2500:             * comparison operators ({@literal <}, ==,
2501:             * {@literal >}, {@literal >=}, !=, {@literal <=}).  The
2502:             * suggested idiom for performing these comparisons is:
2503:             * {@code (x.compareTo(y)} &lt;<i>op</i>&gt; {@code 0)}, where
2504:             * &lt;<i>op</i>&gt; is one of the six comparison operators.
2505:             *
2506:             * @param  val {@code BigDecimal} to which this {@code BigDecimal} is 
2507:             *         to be compared.
2508:             * @return -1, 0, or 1 as this {@code BigDecimal} is numerically 
2509:             *          less than, equal to, or greater than {@code val}.
2510:             */
2511:            public int compareTo(BigDecimal val) {
2512:                if (this .scale == val.scale && this .intCompact != INFLATED
2513:                        && val.intCompact != INFLATED)
2514:                    return longCompareTo(this .intCompact, val.intCompact);
2515:
2516:                // Optimization: would run fine without the next three lines
2517:                int sigDiff = signum() - val.signum();
2518:                if (sigDiff != 0)
2519:                    return (sigDiff > 0 ? 1 : -1);
2520:
2521:                // If the (adjusted) exponents are different we do not need to
2522:                // expensively match scales and compare the significands
2523:                int aethis  = this .precision() - this .scale; // [-1]
2524:                int aeval = val.precision() - val.scale; // [-1]
2525:                if (aethis  < aeval)
2526:                    return -this .signum();
2527:                else if (aethis  > aeval)
2528:                    return this .signum();
2529:
2530:                // Scale and compare intVals
2531:                BigDecimal arg[] = { this , val };
2532:                matchScale(arg);
2533:                if (arg[0].intCompact != INFLATED
2534:                        && arg[1].intCompact != INFLATED)
2535:                    return longCompareTo(arg[0].intCompact, arg[1].intCompact);
2536:                return arg[0].inflate().intVal
2537:                        .compareTo(arg[1].inflate().intVal);
2538:            }
2539:
2540:            /**
2541:             * Compares this {@code BigDecimal} with the specified
2542:             * {@code Object} for equality.  Unlike {@link
2543:             * #compareTo(BigDecimal) compareTo}, this method considers two
2544:             * {@code BigDecimal} objects equal only if they are equal in
2545:             * value and scale (thus 2.0 is not equal to 2.00 when compared by
2546:             * this method).
2547:             *
2548:             * @param  x {@code Object} to which this {@code BigDecimal} is 
2549:             *         to be compared.
2550:             * @return {@code true} if and only if the specified {@code Object} is a
2551:             *         {@code BigDecimal} whose value and scale are equal to this 
2552:             *         {@code BigDecimal}'s.
2553:             * @see    #compareTo(java.math.BigDecimal)
2554:             * @see    #hashCode
2555:             */
2556:            public boolean equals(Object x) {
2557:                if (!(x instanceof  BigDecimal))
2558:                    return false;
2559:                BigDecimal xDec = (BigDecimal) x;
2560:                if (scale != xDec.scale)
2561:                    return false;
2562:                if (this .intCompact != INFLATED && xDec.intCompact != INFLATED)
2563:                    return this .intCompact == xDec.intCompact;
2564:                return this .inflate().intVal.equals(xDec.inflate().intVal);
2565:            }
2566:
2567:            /**
2568:             * Returns the minimum of this {@code BigDecimal} and
2569:             * {@code val}.
2570:             *
2571:             * @param  val value with which the minimum is to be computed.
2572:             * @return the {@code BigDecimal} whose value is the lesser of this 
2573:             *         {@code BigDecimal} and {@code val}.  If they are equal, 
2574:             *         as defined by the {@link #compareTo(BigDecimal) compareTo}  
2575:             *         method, {@code this} is returned.
2576:             * @see    #compareTo(java.math.BigDecimal)
2577:             */
2578:            public BigDecimal min(BigDecimal val) {
2579:                return (compareTo(val) <= 0 ? this  : val);
2580:            }
2581:
2582:            /**
2583:             * Returns the maximum of this {@code BigDecimal} and {@code val}.
2584:             *
2585:             * @param  val value with which the maximum is to be computed.
2586:             * @return the {@code BigDecimal} whose value is the greater of this 
2587:             *         {@code BigDecimal} and {@code val}.  If they are equal, 
2588:             *         as defined by the {@link #compareTo(BigDecimal) compareTo} 
2589:             *         method, {@code this} is returned.
2590:             * @see    #compareTo(java.math.BigDecimal)
2591:             */
2592:            public BigDecimal max(BigDecimal val) {
2593:                return (compareTo(val) >= 0 ? this  : val);
2594:            }
2595:
2596:            // Hash Function
2597:
2598:            /**
2599:             * Returns the hash code for this {@code BigDecimal}.  Note that
2600:             * two {@code BigDecimal} objects that are numerically equal but
2601:             * differ in scale (like 2.0 and 2.00) will generally <i>not</i>
2602:             * have the same hash code.
2603:             *
2604:             * @return hash code for this {@code BigDecimal}.
2605:             * @see #equals(Object)
2606:             */
2607:            public int hashCode() {
2608:                if (intCompact != INFLATED) {
2609:                    long val2 = (intCompact < 0) ? -intCompact : intCompact;
2610:                    int temp = (int) (((int) (val2 >>> 32)) * 31 + (val2 & 0xffffffffL));
2611:                    return 31 * ((intCompact < 0) ? -temp : temp) + scale;
2612:                } else
2613:                    return 31 * intVal.hashCode() + scale;
2614:            }
2615:
2616:            // Format Converters
2617:
2618:            /**
2619:             * Returns the string representation of this {@code BigDecimal},
2620:             * using scientific notation if an exponent is needed.
2621:             * 
2622:             * <p>A standard canonical string form of the {@code BigDecimal}
2623:             * is created as though by the following steps: first, the
2624:             * absolute value of the unscaled value of the {@code BigDecimal}
2625:             * is converted to a string in base ten using the characters
2626:             * {@code '0'} through {@code '9'} with no leading zeros (except
2627:             * if its value is zero, in which case a single {@code '0'}
2628:             * character is used).
2629:             * 
2630:             * <p>Next, an <i>adjusted exponent</i> is calculated; this is the
2631:             * negated scale, plus the number of characters in the converted
2632:             * unscaled value, less one.  That is,
2633:             * {@code -scale+(ulength-1)}, where {@code ulength} is the
2634:             * length of the absolute value of the unscaled value in decimal
2635:             * digits (its <i>precision</i>).
2636:             * 
2637:             * <p>If the scale is greater than or equal to zero and the
2638:             * adjusted exponent is greater than or equal to {@code -6}, the
2639:             * number will be converted to a character form without using
2640:             * exponential notation.  In this case, if the scale is zero then
2641:             * no decimal point is added and if the scale is positive a
2642:             * decimal point will be inserted with the scale specifying the
2643:             * number of characters to the right of the decimal point.
2644:             * {@code '0'} characters are added to the left of the converted
2645:             * unscaled value as necessary.  If no character precedes the
2646:             * decimal point after this insertion then a conventional
2647:             * {@code '0'} character is prefixed.
2648:             * 
2649:             * <p>Otherwise (that is, if the scale is negative, or the
2650:             * adjusted exponent is less than {@code -6}), the number will be
2651:             * converted to a character form using exponential notation.  In
2652:             * this case, if the converted {@code BigInteger} has more than
2653:             * one digit a decimal point is inserted after the first digit.
2654:             * An exponent in character form is then suffixed to the converted
2655:             * unscaled value (perhaps with inserted decimal point); this
2656:             * comprises the letter {@code 'E'} followed immediately by the
2657:             * adjusted exponent converted to a character form.  The latter is
2658:             * in base ten, using the characters {@code '0'} through
2659:             * {@code '9'} with no leading zeros, and is always prefixed by a
2660:             * sign character {@code '-'} (<tt>'&#92;u002D'</tt>) if the
2661:             * adjusted exponent is negative, {@code '+'}
2662:             * (<tt>'&#92;u002B'</tt>) otherwise).
2663:             * 
2664:             * <p>Finally, the entire string is prefixed by a minus sign
2665:             * character {@code '-'} (<tt>'&#92;u002D'</tt>) if the unscaled
2666:             * value is less than zero.  No sign character is prefixed if the
2667:             * unscaled value is zero or positive.
2668:             * 
2669:             * <p><b>Examples:</b>
2670:             * <p>For each representation [<i>unscaled value</i>, <i>scale</i>]
2671:             * on the left, the resulting string is shown on the right.
2672:             * <pre>
2673:             * [123,0]      "123"
2674:             * [-123,0]     "-123"
2675:             * [123,-1]     "1.23E+3"
2676:             * [123,-3]     "1.23E+5"
2677:             * [123,1]      "12.3"
2678:             * [123,5]      "0.00123"
2679:             * [123,10]     "1.23E-8"
2680:             * [-123,12]    "-1.23E-10"
2681:             * </pre>
2682:             *
2683:             * <b>Notes:</b>
2684:             * <ol>
2685:             *
2686:             * <li>There is a one-to-one mapping between the distinguishable
2687:             * {@code BigDecimal} values and the result of this conversion.
2688:             * That is, every distinguishable {@code BigDecimal} value
2689:             * (unscaled value and scale) has a unique string representation
2690:             * as a result of using {@code toString}.  If that string
2691:             * representation is converted back to a {@code BigDecimal} using
2692:             * the {@link #BigDecimal(String)} constructor, then the original
2693:             * value will be recovered.
2694:             * 
2695:             * <li>The string produced for a given number is always the same;
2696:             * it is not affected by locale.  This means that it can be used
2697:             * as a canonical string representation for exchanging decimal
2698:             * data, or as a key for a Hashtable, etc.  Locale-sensitive
2699:             * number formatting and parsing is handled by the {@link
2700:             * java.text.NumberFormat} class and its subclasses.
2701:             * 
2702:             * <li>The {@link #toEngineeringString} method may be used for
2703:             * presenting numbers with exponents in engineering notation, and the
2704:             * {@link #setScale(int,RoundingMode) setScale} method may be used for
2705:             * rounding a {@code BigDecimal} so it has a known number of digits after
2706:             * the decimal point.
2707:             * 
2708:             * <li>The digit-to-character mapping provided by
2709:             * {@code Character.forDigit} is used.
2710:             *
2711:             * </ol>
2712:             *
2713:             * @return string representation of this {@code BigDecimal}.
2714:             * @see    Character#forDigit
2715:             * @see    #BigDecimal(java.lang.String)
2716:             */
2717:            public String toString() {
2718:                if (stringCache == null)
2719:                    stringCache = layoutChars(true);
2720:                return stringCache;
2721:            }
2722:
2723:            /**
2724:             * Returns a string representation of this {@code BigDecimal},
2725:             * using engineering notation if an exponent is needed.
2726:             * 
2727:             * <p>Returns a string that represents the {@code BigDecimal} as
2728:             * described in the {@link #toString()} method, except that if
2729:             * exponential notation is used, the power of ten is adjusted to
2730:             * be a multiple of three (engineering notation) such that the
2731:             * integer part of nonzero values will be in the range 1 through
2732:             * 999.  If exponential notation is used for zero values, a
2733:             * decimal point and one or two fractional zero digits are used so
2734:             * that the scale of the zero value is preserved.  Note that
2735:             * unlike the output of {@link #toString()}, the output of this
2736:             * method is <em>not</em> guaranteed to recover the same [integer,
2737:             * scale] pair of this {@code BigDecimal} if the output string is
2738:             * converting back to a {@code BigDecimal} using the {@linkplain
2739:             * #BigDecimal(String) string constructor}.  The result of this method meets
2740:             * the weaker constraint of always producing a numerically equal
2741:             * result from applying the string constructor to the method's output.
2742:             *
2743:             * @return string representation of this {@code BigDecimal}, using
2744:             *         engineering notation if an exponent is needed.
2745:             * @since  1.5
2746:             */
2747:            public String toEngineeringString() {
2748:                return layoutChars(false);
2749:            }
2750:
2751:            /**
2752:             * Returns a string representation of this {@code BigDecimal}
2753:             * without an exponent field.  For values with a positive scale,
2754:             * the number of digits to the right of the decimal point is used
2755:             * to indicate scale.  For values with a zero or negative scale,
2756:             * the resulting string is generated as if the value were
2757:             * converted to a numerically equal value with zero scale and as
2758:             * if all the trailing zeros of the zero scale value were present
2759:             * in the result.
2760:             *
2761:             * The entire string is prefixed by a minus sign character '-'
2762:             * (<tt>'&#92;u002D'</tt>) if the unscaled value is less than
2763:             * zero. No sign character is prefixed if the unscaled value is
2764:             * zero or positive.
2765:             *
2766:             * Note that if the result of this method is passed to the
2767:             * {@linkplain #BigDecimal(String) string constructor}, only the
2768:             * numerical value of this {@code BigDecimal} will necessarily be
2769:             * recovered; the representation of the new {@code BigDecimal}
2770:             * may have a different scale.  In particular, if this
2771:             * {@code BigDecimal} has a negative scale, the string resulting
2772:             * from this method will have a scale of zero when processed by
2773:             * the string constructor.
2774:             *
2775:             * (This method behaves analogously to the {@code toString}
2776:             * method in 1.4 and earlier releases.)
2777:             *
2778:             * @return a string representation of this {@code BigDecimal}
2779:             * without an exponent field.
2780:             * @since 1.5
2781:             * @see #toString()
2782:             * @see #toEngineeringString()
2783:             */
2784:            public String toPlainString() {
2785:                BigDecimal bd = this ;
2786:                if (bd.scale < 0)
2787:                    bd = bd.setScale(0);
2788:                bd.inflate();
2789:                if (bd.scale == 0) // No decimal point
2790:                    return bd.intVal.toString();
2791:                return bd.getValueString(bd.signum(), bd.intVal.abs()
2792:                        .toString(), bd.scale);
2793:            }
2794:
2795:            /* Returns a digit.digit string */
2796:            private String getValueString(int signum, String intString,
2797:                    int scale) {
2798:                /* Insert decimal point */
2799:                StringBuilder buf;
2800:                int insertionPoint = intString.length() - scale;
2801:                if (insertionPoint == 0) { /* Point goes right before intVal */
2802:                    return (signum < 0 ? "-0." : "0.") + intString;
2803:                } else if (insertionPoint > 0) { /* Point goes inside intVal */
2804:                    buf = new StringBuilder(intString);
2805:                    buf.insert(insertionPoint, '.');
2806:                    if (signum < 0)
2807:                        buf.insert(0, '-');
2808:                } else { /* We must insert zeros between point and intVal */
2809:                    buf = new StringBuilder(3 - insertionPoint
2810:                            + intString.length());
2811:                    buf.append(signum < 0 ? "-0." : "0.");
2812:                    for (int i = 0; i < -insertionPoint; i++)
2813:                        buf.append('0');
2814:                    buf.append(intString);
2815:                }
2816:                return buf.toString();
2817:            }
2818:
2819:            /**
2820:             * Converts this {@code BigDecimal} to a {@code BigInteger}.
2821:             * This conversion is analogous to a <a
2822:             * href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363"><i>narrowing
2823:             * primitive conversion</i></a> from {@code double} to
2824:             * {@code long} as defined in the <a
2825:             * href="http://java.sun.com/docs/books/jls/html/">Java Language
2826:             * Specification</a>: any fractional part of this
2827:             * {@code BigDecimal} will be discarded.  Note that this
2828:             * conversion can lose information about the precision of the
2829:             * {@code BigDecimal} value.
2830:             * <p>
2831:             * To have an exception thrown if the conversion is inexact (in
2832:             * other words if a nonzero fractional part is discarded), use the
2833:             * {@link #toBigIntegerExact()} method.
2834:             *
2835:             * @return this {@code BigDecimal} converted to a {@code BigInteger}.
2836:             */
2837:            public BigInteger toBigInteger() {
2838:                // force to an integer, quietly
2839:                return this .setScale(0, ROUND_DOWN).inflate().intVal;
2840:            }
2841:
2842:            /**
2843:             * Converts this {@code BigDecimal} to a {@code BigInteger},
2844:             * checking for lost information.  An exception is thrown if this
2845:             * {@code BigDecimal} has a nonzero fractional part.
2846:             *
2847:             * @return this {@code BigDecimal} converted to a {@code BigInteger}.
2848:             * @throws ArithmeticException if {@code this} has a nonzero
2849:             *         fractional part.
2850:             * @since  1.5
2851:             */
2852:            public BigInteger toBigIntegerExact() {
2853:                // round to an integer, with Exception if decimal part non-0
2854:                return this .setScale(0, ROUND_UNNECESSARY).inflate().intVal;
2855:            }
2856:
2857:            /**
2858:             * Converts this {@code BigDecimal} to a {@code long}.  This
2859:             * conversion is analogous to a <a
2860:             * href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363"><i>narrowing
2861:             * primitive conversion</i></a> from {@code double} to
2862:             * {@code short} as defined in the <a
2863:             * href="http://java.sun.com/docs/books/jls/html/">Java Language
2864:             * Specification</a>: any fractional part of this
2865:             * {@code BigDecimal} will be discarded, and if the resulting
2866:             * "{@code BigInteger}" is too big to fit in a
2867:             * {@code long}, only the low-order 64 bits are returned.
2868:             * Note that this conversion can lose information about the
2869:             * overall magnitude and precision of this {@code BigDecimal} value as well
2870:             * as return a result with the opposite sign.
2871:             * 
2872:             * @return this {@code BigDecimal} converted to a {@code long}.
2873:             */
2874:            public long longValue() {
2875:                return (intCompact != INFLATED && scale == 0) ? intCompact
2876:                        : toBigInteger().longValue();
2877:            }
2878:
2879:            /**
2880:             * Converts this {@code BigDecimal} to a {@code long}, checking
2881:             * for lost information.  If this {@code BigDecimal} has a
2882:             * nonzero fractional part or is out of the possible range for a
2883:             * {@code long} result then an {@code ArithmeticException} is
2884:             * thrown.
2885:             *
2886:             * @return this {@code BigDecimal} converted to a {@code long}.
2887:             * @throws ArithmeticException if {@code this} has a nonzero
2888:             *         fractional part, or will not fit in a {@code long}.
2889:             * @since  1.5
2890:             */
2891:            public long longValueExact() {
2892:                if (intCompact != INFLATED && scale == 0)
2893:                    return intCompact;
2894:                // If more than 19 digits in integer part it cannot possibly fit
2895:                if ((precision() - scale) > 19) // [OK for negative scale too]
2896:                    throw new java.lang.ArithmeticException("Overflow");
2897:                // Fastpath zero and < 1.0 numbers (the latter can be very slow
2898:                // to round if very small)
2899:                if (this .signum() == 0)
2900:                    return 0;
2901:                if ((this .precision() - this .scale) <= 0)
2902:                    throw new ArithmeticException("Rounding necessary");
2903:                // round to an integer, with Exception if decimal part non-0
2904:                BigDecimal num = this .setScale(0, ROUND_UNNECESSARY).inflate();
2905:                if (num.precision() >= 19) // need to check carefully
2906:                    LongOverflow.check(num);
2907:                return num.intVal.longValue();
2908:            }
2909:
2910:            private static class LongOverflow {
2911:                /** BigInteger equal to Long.MIN_VALUE. */
2912:                private static final BigInteger LONGMIN = BigInteger
2913:                        .valueOf(Long.MIN_VALUE);
2914:
2915:                /** BigInteger equal to Long.MAX_VALUE. */
2916:                private static final BigInteger LONGMAX = BigInteger
2917:                        .valueOf(Long.MAX_VALUE);
2918:
2919:                public static void check(BigDecimal num) {
2920:                    if ((num.intVal.compareTo(LONGMIN) < 0)
2921:                            || (num.intVal.compareTo(LONGMAX) > 0))
2922:                        throw new java.lang.ArithmeticException("Overflow");
2923:                }
2924:            }
2925:
2926:            /**
2927:             * Converts this {@code BigDecimal} to an {@code int}.  This
2928:             * conversion is analogous to a <a
2929:             * href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363"><i>narrowing
2930:             * primitive conversion</i></a> from {@code double} to
2931:             * {@code short} as defined in the <a
2932:             * href="http://java.sun.com/docs/books/jls/html/">Java Language
2933:             * Specification</a>: any fractional part of this
2934:             * {@code BigDecimal} will be discarded, and if the resulting
2935:             * "{@code BigInteger}" is too big to fit in an
2936:             * {@code int}, only the low-order 32 bits are returned.
2937:             * Note that this conversion can lose information about the
2938:             * overall magnitude and precision of this {@code BigDecimal}
2939:             * value as well as return a result with the opposite sign.
2940:             * 
2941:             * @return this {@code BigDecimal} converted to an {@code int}.
2942:             */
2943:            public int intValue() {
2944:                return (intCompact != INFLATED && scale == 0) ? (int) intCompact
2945:                        : toBigInteger().intValue();
2946:            }
2947:
2948:            /**
2949:             * Converts this {@code BigDecimal} to an {@code int}, checking
2950:             * for lost information.  If this {@code BigDecimal} has a
2951:             * nonzero fractional part or is out of the possible range for an
2952:             * {@code int} result then an {@code ArithmeticException} is
2953:             * thrown.
2954:             *
2955:             * @return this {@code BigDecimal} converted to an {@code int}.
2956:             * @throws ArithmeticException if {@code this} has a nonzero
2957:             *         fractional part, or will not fit in an {@code int}.
2958:             * @since  1.5
2959:             */
2960:            public int intValueExact() {
2961:                long num;
2962:                num = this .longValueExact(); // will check decimal part
2963:                if ((int) num != num)
2964:                    throw new java.lang.ArithmeticException("Overflow");
2965:                return (int) num;
2966:            }
2967:
2968:            /**
2969:             * Converts this {@code BigDecimal} to a {@code short}, checking
2970:             * for lost information.  If this {@code BigDecimal} has a
2971:             * nonzero fractional part or is out of the possible range for a
2972:             * {@code short} result then an {@code ArithmeticException} is
2973:             * thrown.
2974:             *
2975:             * @return this {@code BigDecimal} converted to a {@code short}.
2976:             * @throws ArithmeticException if {@code this} has a nonzero
2977:             *         fractional part, or will not fit in a {@code short}.
2978:             * @since  1.5
2979:             */
2980:            public short shortValueExact() {
2981:                long num;
2982:                num = this .longValueExact(); // will check decimal part
2983:                if ((short) num != num)
2984:                    throw new java.lang.ArithmeticException("Overflow");
2985:                return (short) num;
2986:            }
2987:
2988:            /**
2989:             * Converts this {@code BigDecimal} to a {@code byte}, checking
2990:             * for lost information.  If this {@code BigDecimal} has a
2991:             * nonzero fractional part or is out of the possible range for a
2992:             * {@code byte} result then an {@code ArithmeticException} is
2993:             * thrown.
2994:             *
2995:             * @return this {@code BigDecimal} converted to a {@code byte}.
2996:             * @throws ArithmeticException if {@code this} has a nonzero
2997:             *         fractional part, or will not fit in a {@code byte}.
2998:             * @since  1.5
2999:             */
3000:            public byte byteValueExact() {
3001:                long num;
3002:                num = this .longValueExact(); // will check decimal part
3003:                if ((byte) num != num)
3004:                    throw new java.lang.ArithmeticException("Overflow");
3005:                return (byte) num;
3006:            }
3007:
3008:            /**
3009:             * Converts this {@code BigDecimal} to a {@code float}.
3010:             * This conversion is similar to the <a
3011:             * href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363"><i>narrowing
3012:             * primitive conversion</i></a> from {@code double} to
3013:             * {@code float} defined in the <a
3014:             * href="http://java.sun.com/docs/books/jls/html/">Java Language
3015:             * Specification</a>: if this {@code BigDecimal} has too great a
3016:             * magnitude to represent as a {@code float}, it will be
3017:             * converted to {@link Float#NEGATIVE_INFINITY} or {@link
3018:             * Float#POSITIVE_INFINITY} as appropriate.  Note that even when
3019:             * the return value is finite, this conversion can lose
3020:             * information about the precision of the {@code BigDecimal}
3021:             * value.
3022:             * 
3023:             * @return this {@code BigDecimal} converted to a {@code float}.
3024:             */
3025:            public float floatValue() {
3026:                if (scale == 0 && intCompact != INFLATED)
3027:                    return (float) intCompact;
3028:                // Somewhat inefficient, but guaranteed to work.
3029:                return Float.parseFloat(this .toString());
3030:            }
3031:
3032:            /**
3033:             * Converts this {@code BigDecimal} to a {@code double}.
3034:             * This conversion is similar to the <a
3035:             * href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363"><i>narrowing
3036:             * primitive conversion</i></a> from {@code double} to
3037:             * {@code float} as defined in the <a
3038:             * href="http://java.sun.com/docs/books/jls/html/">Java Language
3039:             * Specification</a>: if this {@code BigDecimal} has too great a
3040:             * magnitude represent as a {@code double}, it will be
3041:             * converted to {@link Double#NEGATIVE_INFINITY} or {@link
3042:             * Double#POSITIVE_INFINITY} as appropriate.  Note that even when
3043:             * the return value is finite, this conversion can lose
3044:             * information about the precision of the {@code BigDecimal}
3045:             * value.
3046:             * 
3047:             * @return this {@code BigDecimal} converted to a {@code double}.
3048:             */
3049:            public double doubleValue() {
3050:                if (scale == 0 && intCompact != INFLATED)
3051:                    return (double) intCompact;
3052:                // Somewhat inefficient, but guaranteed to work.
3053:                return Double.parseDouble(this .toString());
3054:            }
3055:
3056:            /**
3057:             * Returns the size of an ulp, a unit in the last place, of this
3058:             * {@code BigDecimal}.  An ulp of a nonzero {@code BigDecimal}
3059:             * value is the positive distance between this value and the
3060:             * {@code BigDecimal} value next larger in magnitude with the
3061:             * same number of digits.  An ulp of a zero value is numerically
3062:             * equal to 1 with the scale of {@code this}.  The result is
3063:             * stored with the same scale as {@code this} so the result
3064:             * for zero and nonzero values is equal to {@code [1,
3065:             * this.scale()]}.
3066:             *
3067:             * @return the size of an ulp of {@code this}
3068:             * @since 1.5
3069:             */
3070:            public BigDecimal ulp() {
3071:                return BigDecimal.valueOf(1, this .scale());
3072:            }
3073:
3074:            // Private "Helper" Methods
3075:
3076:            /**
3077:             * Lay out this {@code BigDecimal} into a {@code char[]} array.
3078:             * The Java 1.2 equivalent to this was called {@code getValueString}.
3079:             *
3080:             * @param  sci {@code true} for Scientific exponential notation;
3081:             *          {@code false} for Engineering
3082:             * @return string with canonical string representation of this
3083:             *         {@code BigDecimal}
3084:             */
3085:            private String layoutChars(boolean sci) {
3086:                if (scale == 0) // zero scale is trivial
3087:                    return (intCompact != INFLATED) ? Long.toString(intCompact)
3088:                            : intVal.toString();
3089:
3090:                // Get the significand as an absolute value
3091:                char coeff[];
3092:                if (intCompact != INFLATED)
3093:                    coeff = Long.toString(Math.abs(intCompact)).toCharArray();
3094:                else
3095:                    coeff = intVal.abs().toString().toCharArray();
3096:
3097:                // Construct a buffer, with sufficient capacity for all cases.
3098:                // If E-notation is needed, length will be: +1 if negative, +1
3099:                // if '.' needed, +2 for "E+", + up to 10 for adjusted exponent.
3100:                // Otherwise it could have +1 if negative, plus leading "0.00000"
3101:                StringBuilder buf = new StringBuilder(coeff.length + 14);
3102:                if (signum() < 0) // prefix '-' if negative
3103:                    buf.append('-');
3104:                long adjusted = -(long) scale + (coeff.length - 1);
3105:                if ((scale >= 0) && (adjusted >= -6)) { // plain number
3106:                    int pad = scale - coeff.length; // count of padding zeros
3107:                    if (pad >= 0) { // 0.xxx form
3108:                        buf.append('0');
3109:                        buf.append('.');
3110:                        for (; pad > 0; pad--) {
3111:                            buf.append('0');
3112:                        }
3113:                        buf.append(coeff);
3114:                    } else { // xx.xx form
3115:                        buf.append(coeff, 0, -pad);
3116:                        buf.append('.');
3117:                        buf.append(coeff, -pad, scale);
3118:                    }
3119:                } else { // E-notation is needed
3120:                    if (sci) { // Scientific notation
3121:                        buf.append(coeff[0]); // first character
3122:                        if (coeff.length > 1) { // more to come
3123:                            buf.append('.');
3124:                            buf.append(coeff, 1, coeff.length - 1);
3125:                        }
3126:                    } else { // Engineering notation
3127:                        int sig = (int) (adjusted % 3);
3128:                        if (sig < 0)
3129:                            sig += 3; // [adjusted was negative]
3130:                        adjusted -= sig; // now a multiple of 3
3131:                        sig++;
3132:                        if (signum() == 0) {
3133:                            switch (sig) {
3134:                            case 1:
3135:                                buf.append('0'); // exponent is a multiple of three
3136:                                break;
3137:                            case 2:
3138:                                buf.append("0.00");
3139:                                adjusted += 3;
3140:                                break;
3141:                            case 3:
3142:                                buf.append("0.0");
3143:                                adjusted += 3;
3144:                                break;
3145:                            default:
3146:                                throw new AssertionError(
3147:                                        "Unexpected sig value " + sig);
3148:                            }
3149:                        } else if (sig >= coeff.length) { // significand all in integer
3150:                            buf.append(coeff, 0, coeff.length);
3151:                            // may need some zeros, too
3152:                            for (int i = sig - coeff.length; i > 0; i--)
3153:                                buf.append('0');
3154:                        } else { // xx.xxE form
3155:                            buf.append(coeff, 0, sig);
3156:                            buf.append('.');
3157:                            buf.append(coeff, sig, coeff.length - sig);
3158:                        }
3159:                    }
3160:                    if (adjusted != 0) { // [!sci could have made 0]
3161:                        buf.append('E');
3162:                        if (adjusted > 0) // force sign for positive
3163:                            buf.append('+');
3164:                        buf.append(adjusted);
3165:                    }
3166:                }
3167:                return buf.toString();
3168:            }
3169:
3170:            /**
3171:             * Return 10 to the power n, as a {@code BigInteger}.
3172:             *
3173:             * @param  n the power of ten to be returned (>=0)
3174:             * @return a {@code BigInteger} with the value (10<sup>n</sup>)
3175:             */
3176:            private static BigInteger tenToThe(int n) {
3177:                if (n < TENPOWERS.length) // use value from constant array
3178:                    return TENPOWERS[n];
3179:                // BigInteger.pow is slow, so make 10**n by constructing a
3180:                // BigInteger from a character string (still not very fast)
3181:                char tenpow[] = new char[n + 1];
3182:                tenpow[0] = '1';
3183:                for (int i = 1; i <= n; i++)
3184:                    tenpow[i] = '0';
3185:                return new BigInteger(tenpow);
3186:            }
3187:
3188:            private static BigInteger TENPOWERS[] = { BigInteger.ONE,
3189:                    BigInteger.valueOf(10), BigInteger.valueOf(100),
3190:                    BigInteger.valueOf(1000), BigInteger.valueOf(10000),
3191:                    BigInteger.valueOf(100000), BigInteger.valueOf(1000000),
3192:                    BigInteger.valueOf(10000000),
3193:                    BigInteger.valueOf(100000000),
3194:                    BigInteger.valueOf(1000000000) };
3195:
3196:            /**
3197:             * Compute val * 10 ^ n; return this product if it is
3198:             * representable as a long, INFLATED otherwise.
3199:             */
3200:            private static long longTenToThe(long val, int n) {
3201:                // System.err.print("\tval " + val + "\t power " + n + "\tresult ");
3202:                if (n >= 0 && n < thresholds.length) {
3203:                    if (Math.abs(val) <= thresholds[n][0]) {
3204:                        // System.err.println(val * thresholds[n][1]);
3205:                        return val * thresholds[n][1];
3206:                    }
3207:                }
3208:                // System.err.println(INFLATED);
3209:                return INFLATED;
3210:            }
3211:
3212:            private static long thresholds[][] = { { Long.MAX_VALUE, 1L }, // 0
3213:                    { Long.MAX_VALUE / 10L, 10L }, // 1
3214:                    { Long.MAX_VALUE / 100L, 100L }, // 2
3215:                    { Long.MAX_VALUE / 1000L, 1000L }, // 3
3216:                    { Long.MAX_VALUE / 10000L, 10000L }, // 4
3217:                    { Long.MAX_VALUE / 100000L, 100000L }, // 5
3218:                    { Long.MAX_VALUE / 1000000L, 1000000L }, // 6
3219:                    { Long.MAX_VALUE / 10000000L, 10000000L }, // 7
3220:                    { Long.MAX_VALUE / 100000000L, 100000000L }, // 8
3221:                    { Long.MAX_VALUE / 1000000000L, 1000000000L }, // 9
3222:                    { Long.MAX_VALUE / 10000000000L, 10000000000L }, // 10
3223:                    { Long.MAX_VALUE / 100000000000L, 100000000000L }, // 11
3224:                    { Long.MAX_VALUE / 1000000000000L, 1000000000000L },// 12
3225:                    { Long.MAX_VALUE / 100000000000000L, 10000000000000L },// 13
3226:            };
3227:
3228:            private static boolean compactLong(long val) {
3229:                return (val != Long.MIN_VALUE);
3230:            }
3231:
3232:            /**
3233:             * Assign appropriate BigInteger to intVal field if intVal is
3234:             * null, i.e. the compact representation is in use.
3235:             */
3236:            private BigDecimal inflate() {
3237:                if (intVal == null)
3238:                    intVal = BigInteger.valueOf(intCompact);
3239:                return this ;
3240:            }
3241:
3242:            /**
3243:             * Match the scales of two {@code BigDecimal}s to align their
3244:             * least significant digits.
3245:             * 
3246:             * <p>If the scales of val[0] and val[1] differ, rescale
3247:             * (non-destructively) the lower-scaled {@code BigDecimal} so
3248:             * they match.  That is, the lower-scaled reference will be
3249:             * replaced by a reference to a new object with the same scale as
3250:             * the other {@code BigDecimal}.
3251:             *
3252:             * @param  val array of two elements referring to the two
3253:             *         {@code BigDecimal}s to be aligned.
3254:             */
3255:            private static void matchScale(BigDecimal[] val) {
3256:                if (val[0].scale < val[1].scale)
3257:                    val[0] = val[0].setScale(val[1].scale);
3258:                else if (val[1].scale < val[0].scale)
3259:                    val[1] = val[1].setScale(val[0].scale);
3260:            }
3261:
3262:            /**
3263:             * Reconstitute the {@code BigDecimal} instance from a stream (that is,
3264:             * deserialize it).
3265:             *
3266:             * @param s the stream being read.
3267:             */
3268:            private void readObject(java.io.ObjectInputStream s)
3269:                    throws java.io.IOException, ClassNotFoundException {
3270:                // Read in all fields
3271:                s.defaultReadObject();
3272:                // validate possibly bad fields
3273:                if (intVal == null) {
3274:                    String message = "BigDecimal: null intVal in stream";
3275:                    throw new java.io.StreamCorruptedException(message);
3276:                    // [all values of scale are now allowed]
3277:                }
3278:                // Set intCompact to uninitialized value; could also see if the
3279:                // intVal was small enough to fit as a compact value.
3280:                intCompact = INFLATED;
3281:            }
3282:
3283:            /**
3284:             * Serialize this {@code BigDecimal} to the stream in question
3285:             *
3286:             * @param s the stream to serialize to.
3287:             */
3288:            private void writeObject(java.io.ObjectOutputStream s)
3289:                    throws java.io.IOException {
3290:                // Must inflate to maintain compatible serial form.
3291:                this .inflate();
3292:
3293:                // Write proper fields
3294:                s.defaultWriteObject();
3295:            }
3296:
3297:            /**
3298:             * Returns the length of this {@code BigDecimal}, in decimal digits.
3299:             *
3300:             * Notes:
3301:             *<ul>
3302:             * <li> This is performance-critical; most operations where a
3303:             *      context is supplied will need at least one call to this
3304:             *      method.
3305:             *
3306:             * <li> This should be a method on BigInteger; the call to this
3307:             *      method in precision() can then be replaced with the
3308:             *      term: intVal.digitLength().  It could also be called
3309:             *      precision() in BigInteger.
3310:             *
3311:             *      Better still -- the precision lookaside could be moved to
3312:             *      BigInteger, too.
3313:             *
3314:             * <li> This could/should use MutableBigIntegers directly for the
3315:             *      reduction loop.
3316:             *<ul>
3317:             * @return the length of the unscaled value, in decimal digits
3318:             */
3319:            private int digitLength() {
3320:                if (intCompact != INFLATED
3321:                        && Math.abs(intCompact) <= Integer.MAX_VALUE)
3322:                    return intLength(Math.abs((int) intCompact));
3323:                if (signum() == 0) // 0 is one decimal digit
3324:                    return 1;
3325:                this .inflate();
3326:                // we have a nonzero magnitude
3327:                BigInteger work = intVal;
3328:                int digits = 0; // counter
3329:                for (; work.mag.length > 1;) {
3330:                    // here when more than one integer in the magnitude; divide
3331:                    // by a billion (reduce by 9 digits) and try again
3332:                    work = work.divide(TENPOWERS[9]);
3333:                    digits += 9;
3334:                    if (work.signum() == 0) // the division was exact
3335:                        return digits; // (a power of a billion)
3336:                }
3337:                // down to a simple nonzero integer
3338:                digits += intLength(work.mag[0]);
3339:                // System.out.println("digitLength... "+this+"  ->  "+digits);
3340:                return digits;
3341:            }
3342:
3343:            private static int[] ilogTable = { 0, 9, 99, 999, 9999, 99999,
3344:                    999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE };
3345:
3346:            /**
3347:             * Returns the length of an unsigned {@code int}, in decimal digits.
3348:             * @param i the {@code int} (treated as unsigned)
3349:             * @return the length of the unscaled value, in decimal digits
3350:             */
3351:            private int intLength(int x) {
3352:                int digits;
3353:                if (x < 0) { // 'negative' is 10 digits unsigned
3354:                    return 10;
3355:                } else { // positive integer
3356:                    if (x <= 9)
3357:                        return 1;
3358:                    // "Hacker's Delight"  section 11-4
3359:                    for (int i = -1;; i++) {
3360:                        if (x <= ilogTable[i + 1])
3361:                            return i + 1;
3362:                    }
3363:                }
3364:            }
3365:
3366:            /**
3367:             * Remove insignificant trailing zeros from this
3368:             * {@code BigDecimal} until the preferred scale is reached or no
3369:             * more zeros can be removed.  If the preferred scale is less than
3370:             * Integer.MIN_VALUE, all the trailing zeros will be removed.
3371:             *
3372:             * {@code BigInteger} assistance could help, here?
3373:             *
3374:             * <p>WARNING: This method should only be called on new objects as
3375:             * it mutates the value fields.
3376:             *
3377:             * @return this {@code BigDecimal} with a scale possibly reduced
3378:             * to be closed to the preferred scale.
3379:             */
3380:            private BigDecimal stripZerosToMatchScale(long preferredScale) {
3381:                boolean compact = (intCompact != INFLATED);
3382:                this .inflate();
3383:                BigInteger qr[]; // quotient-remainder pair
3384:                while (intVal.abs().compareTo(BigInteger.TEN) >= 0
3385:                        && scale > preferredScale) {
3386:                    if (intVal.testBit(0))
3387:                        break; // odd number cannot end in 0
3388:                    qr = intVal.divideAndRemainder(BigInteger.TEN);
3389:                    if (qr[1].signum() != 0)
3390:                        break; // non-0 remainder
3391:                    intVal = qr[0];
3392:                    scale = checkScale((long) scale - 1); // could Overflow
3393:                    if (precision > 0) // adjust precision if known
3394:                        precision--;
3395:                }
3396:                if (compact)
3397:                    intCompact = intVal.longValue();
3398:                return this ;
3399:            }
3400:
3401:            /**
3402:             * Check a scale for Underflow or Overflow.  If this BigDecimal is
3403:             * uninitialized or initialized and nonzero, throw an exception if
3404:             * the scale is out of range.  If this is zero, saturate the scale
3405:             * to the extreme value of the right sign if the scale is out of
3406:             * range.
3407:             *
3408:             * @param val The new scale.
3409:             * @throws ArithmeticException (overflow or underflow) if the new
3410:             *         scale is out of range.
3411:             * @return validated scale as an int.
3412:             */
3413:            private int checkScale(long val) {
3414:                if ((int) val != val) {
3415:                    if ((this .intCompact != INFLATED && this .intCompact != 0)
3416:                            || (this .intVal != null && this .signum() != 0)
3417:                            || (this .intVal == null && this .intCompact == INFLATED)) {
3418:                        if (val > Integer.MAX_VALUE)
3419:                            throw new ArithmeticException("Underflow");
3420:                        if (val < Integer.MIN_VALUE)
3421:                            throw new ArithmeticException("Overflow");
3422:                    } else {
3423:                        return (val > Integer.MAX_VALUE) ? Integer.MAX_VALUE
3424:                                : Integer.MIN_VALUE;
3425:                    }
3426:                }
3427:                return (int) val;
3428:            }
3429:
3430:            /**
3431:             * Round an operand; used only if digits &gt; 0.  Does not change
3432:             * {@code this}; if rounding is needed a new {@code BigDecimal}
3433:             * is created and returned.
3434:             *
3435:             * @param mc the context to use.
3436:             * @throws ArithmeticException if the result is inexact but the
3437:             *         rounding mode is {@code UNNECESSARY}.
3438:             */
3439:            private BigDecimal roundOp(MathContext mc) {
3440:                BigDecimal rounded = doRound(mc);
3441:                return rounded;
3442:            }
3443:
3444:            /** Round this BigDecimal according to the MathContext settings;
3445:             *  used only if precision {@literal >} 0.
3446:             *
3447:             * <p>WARNING: This method should only be called on new objects as
3448:             * it mutates the value fields.
3449:             *
3450:             * @param mc the context to use.
3451:             * @throws ArithmeticException if the rounding mode is
3452:             *         {@code RoundingMode.UNNECESSARY} and the
3453:             *         {@code BigDecimal} operation would require rounding.
3454:             */
3455:            private void roundThis(MathContext mc) {
3456:                BigDecimal rounded = doRound(mc);
3457:                if (rounded == this ) // wasn't rounded
3458:                    return;
3459:                this .intVal = rounded.intVal;
3460:                this .intCompact = rounded.intCompact;
3461:                this .scale = rounded.scale;
3462:                this .precision = rounded.precision;
3463:            }
3464:
3465:            /**
3466:             * Returns a {@code BigDecimal} rounded according to the
3467:             * MathContext settings; used only if {@code mc.precision > 0}.
3468:             * Does not change {@code this}; if rounding is needed a new
3469:             * {@code BigDecimal} is created and returned.
3470:             *
3471:             * @param mc the context to use.
3472:             * @return a {@code BigDecimal} rounded according to the MathContext
3473:             *         settings.  May return this, if no rounding needed.
3474:             * @throws ArithmeticException if the rounding mode is
3475:             *         {@code RoundingMode.UNNECESSARY} and the
3476:             *         result is inexact.
3477:             */
3478:            private BigDecimal doRound(MathContext mc) {
3479:                this .inflate();
3480:                if (precision == 0) {
3481:                    if (mc.roundingMax != null
3482:                            && intVal.compareTo(mc.roundingMax) < 0
3483:                            && intVal.compareTo(mc.roundingMin) > 0)
3484:                        return this ; // no rounding needed
3485:                    precision(); // find it
3486:                }
3487:                int drop = precision - mc.precision; // digits to discard
3488:                if (drop <= 0) // we fit
3489:                    return this ;
3490:                BigDecimal rounded = dropDigits(mc, drop);
3491:                // we need to double-check, in case of the 999=>1000 case
3492:                return rounded.doRound(mc);
3493:            }
3494:
3495:            /**
3496:             * Removes digits from the significand of a {@code BigDecimal},
3497:             * rounding according to the MathContext settings.  Does not
3498:             * change {@code this}; a new {@code BigDecimal} is always
3499:             * created and returned.
3500:             * 
3501:             * <p>Actual rounding is carried out, as before, by the divide
3502:             * method, as this minimized code changes.  It might be more
3503:             * efficient in most cases to move rounding to here, so we can do
3504:             * a round-to-length rather than round-to-scale.
3505:             *
3506:             * @param mc the context to use.
3507:             * @param drop the number of digits to drop, must be {@literal >} 0
3508:             * @return a {@code BigDecimal} rounded according to the MathContext
3509:             *         settings.  May return {@code this}, if no rounding needed.
3510:             * @throws ArithmeticException if the rounding mode is
3511:             *         {@code RoundingMode.UNNECESSARY} and the
3512:             *         result is inexact.
3513:             */
3514:            private BigDecimal dropDigits(MathContext mc, int drop) {
3515:                // here if we need to round; make the divisor = 10**drop)
3516:                // [calculating the BigInteger here saves setScale later]
3517:                BigDecimal divisor = new BigDecimal(tenToThe(drop), 0);
3518:
3519:                // divide to same scale to force round to length
3520:                BigDecimal rounded = this .divide(divisor, scale,
3521:                        mc.roundingMode.oldMode);
3522:                rounded.scale = checkScale((long) rounded.scale - drop); // adjust the scale
3523:                return rounded;
3524:            }
3525:
3526:            private static int longCompareTo(long x, long y) {
3527:                return (x < y) ? -1 : (x == y) ? 0 : 1;
3528:            }
3529:
3530:            /*
3531:             * Internal printing routine
3532:             */
3533:            private static void print(String name, BigDecimal bd) {
3534:                System.err
3535:                        .format(
3536:                                "%s:\tintCompact %d\tintVal %d\tscale %d\tprecision %d%n",
3537:                                name, bd.intCompact, bd.intVal, bd.scale,
3538:                                bd.precision);
3539:            }
3540:
3541:            /**
3542:             * Check internal invariants of this BigDecimal.  These invariants
3543:             * include:
3544:             *
3545:             * <ul>
3546:             *
3547:             * <li>The object must be initialized; either intCompact must not be
3548:             * INFLATED or intVal is non-null.  Both of these conditions may
3549:             * be true.
3550:             *
3551:             * <li>If both intCompact and intVal and set, their values must be
3552:             * consistent.
3553:             * 
3554:             * <li>If precision is nonzero, it must have the right value.
3555:             * </ul>
3556:             */
3557:            private BigDecimal audit() {
3558:                // Check precision
3559:                if (precision > 0) {
3560:                    if (precision != digitLength()) {
3561:                        print("audit", this );
3562:                        throw new AssertionError("precision mismatch");
3563:                    }
3564:                }
3565:
3566:                if (intCompact == INFLATED) {
3567:                    if (intVal == null) {
3568:                        print("audit", this );
3569:                        throw new AssertionError("null intVal");
3570:                    }
3571:                } else {
3572:                    if (intVal != null) {
3573:                        long val = intVal.longValue();
3574:                        if (val != intCompact) {
3575:                            print("audit", this );
3576:                            throw new AssertionError(
3577:                                    "Inconsistent state, intCompact="
3578:                                            + intCompact + "\t intVal=" + val);
3579:                        }
3580:                    }
3581:                }
3582:                return this;
3583:            }
3584:        }
www.j___a_v__a__2s_.__co_m__ | Contact Us
Copyright 2003 - 08 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.