Home | History | Annotate | Download | only in math
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package java.math;
     19 
     20 import java.io.IOException;
     21 import java.io.ObjectInputStream;
     22 import java.io.ObjectOutputStream;
     23 import java.io.Serializable;
     24 import java.util.Arrays;
     25 import libcore.math.MathUtils;
     26 
     27 /**
     28  * An immutable arbitrary-precision signed decimal.
     29  *
     30  * <p>A value is represented by an arbitrary-precision "unscaled value" and a signed 32-bit "scale",
     31  * combined thus: {@code unscaled * 10<sup>-scale</sup>}. See {@link #unscaledValue} and {@link #scale}.
     32  *
     33  * <p>Most operations allow you to supply a {@link MathContext} to specify a desired rounding mode.
     34  */
     35 public class BigDecimal extends Number implements Comparable<BigDecimal>, Serializable {
     36 
     37     /**
     38      * Rounding mode where positive values are rounded towards positive infinity
     39      * and negative values towards negative infinity.
     40      *
     41      * @see RoundingMode#UP
     42      */
     43     public static final int ROUND_UP = 0;
     44 
     45     /**
     46      * Rounding mode where the values are rounded towards zero.
     47      *
     48      * @see RoundingMode#DOWN
     49      */
     50     public static final int ROUND_DOWN = 1;
     51 
     52     /**
     53      * Rounding mode to round towards positive infinity. For positive values
     54      * this rounding mode behaves as {@link #ROUND_UP}, for negative values as
     55      * {@link #ROUND_DOWN}.
     56      *
     57      * @see RoundingMode#CEILING
     58      */
     59     public static final int ROUND_CEILING = 2;
     60 
     61     /**
     62      * Rounding mode to round towards negative infinity. For positive values
     63      * this rounding mode behaves as {@link #ROUND_DOWN}, for negative values as
     64      * {@link #ROUND_UP}.
     65      *
     66      * @see RoundingMode#FLOOR
     67      */
     68     public static final int ROUND_FLOOR = 3;
     69 
     70     /**
     71      * Rounding mode where values are rounded towards the nearest neighbor.
     72      * Ties are broken by rounding up.
     73      *
     74      * @see RoundingMode#HALF_UP
     75      */
     76     public static final int ROUND_HALF_UP = 4;
     77 
     78     /**
     79      * Rounding mode where values are rounded towards the nearest neighbor.
     80      * Ties are broken by rounding down.
     81      *
     82      * @see RoundingMode#HALF_DOWN
     83      */
     84     public static final int ROUND_HALF_DOWN = 5;
     85 
     86     /**
     87      * Rounding mode where values are rounded towards the nearest neighbor.
     88      * Ties are broken by rounding to the even neighbor.
     89      *
     90      * @see RoundingMode#HALF_EVEN
     91      */
     92     public static final int ROUND_HALF_EVEN = 6;
     93 
     94     /**
     95      * Rounding mode where the rounding operations throws an {@code
     96      * ArithmeticException} for the case that rounding is necessary, i.e. for
     97      * the case that the value cannot be represented exactly.
     98      *
     99      * @see RoundingMode#UNNECESSARY
    100      */
    101     public static final int ROUND_UNNECESSARY = 7;
    102 
    103     /** This is the serialVersionUID used by the sun implementation. */
    104     private static final long serialVersionUID = 6108874887143696463L;
    105 
    106     /** The double closest to {@code Log10(2)}. */
    107     private static final double LOG10_2 = 0.3010299956639812;
    108 
    109     /** The <code>String</code> representation is cached. */
    110     private transient String toStringImage = null;
    111 
    112     /** Cache for the hash code. */
    113     private transient int hashCode = 0;
    114 
    115     /**
    116      * An array with powers of five that fit in the type <code>long</code>
    117      * (<code>5^0,5^1,...,5^27</code>).
    118      */
    119     private static final BigInteger[] FIVE_POW;
    120 
    121     /**
    122      * An array with powers of ten that fit in the type <code>long</code>
    123      * (<code>10^0,10^1,...,10^18</code>).
    124      */
    125     private static final BigInteger[] TEN_POW;
    126 
    127     private static final long[] LONG_FIVE_POW = new long[]
    128     {   1L,
    129         5L,
    130         25L,
    131         125L,
    132         625L,
    133         3125L,
    134         15625L,
    135         78125L,
    136         390625L,
    137         1953125L,
    138         9765625L,
    139         48828125L,
    140         244140625L,
    141         1220703125L,
    142         6103515625L,
    143         30517578125L,
    144         152587890625L,
    145         762939453125L,
    146         3814697265625L,
    147         19073486328125L,
    148         95367431640625L,
    149         476837158203125L,
    150         2384185791015625L,
    151         11920928955078125L,
    152         59604644775390625L,
    153         298023223876953125L,
    154         1490116119384765625L,
    155         7450580596923828125L, };
    156 
    157     private static final int[] LONG_FIVE_POW_BIT_LENGTH = new int[LONG_FIVE_POW.length];
    158     private static final int[] LONG_POWERS_OF_TEN_BIT_LENGTH = new int[MathUtils.LONG_POWERS_OF_TEN.length];
    159 
    160     private static final int BI_SCALED_BY_ZERO_LENGTH = 11;
    161 
    162     /**
    163      * An array with the first <code>BigInteger</code> scaled by zero.
    164      * (<code>[0,0],[1,0],...,[10,0]</code>).
    165      */
    166     private static final BigDecimal[] BI_SCALED_BY_ZERO = new BigDecimal[BI_SCALED_BY_ZERO_LENGTH];
    167 
    168     /**
    169      * An array with the zero number scaled by the first positive scales.
    170      * (<code>0*10^0, 0*10^1, ..., 0*10^10</code>).
    171      */
    172     private static final BigDecimal[] ZERO_SCALED_BY = new BigDecimal[11];
    173 
    174     /** An array filled with characters <code>'0'</code>. */
    175     private static final char[] CH_ZEROS = new char[100];
    176 
    177     static {
    178         Arrays.fill(CH_ZEROS, '0');
    179 
    180         for (int i = 0; i < ZERO_SCALED_BY.length; ++i) {
    181             BI_SCALED_BY_ZERO[i] = new BigDecimal(i, 0);
    182             ZERO_SCALED_BY[i] = new BigDecimal(0, i);
    183         }
    184         for (int i = 0; i < LONG_FIVE_POW_BIT_LENGTH.length; ++i) {
    185             LONG_FIVE_POW_BIT_LENGTH[i] = bitLength(LONG_FIVE_POW[i]);
    186         }
    187         for (int i = 0; i < LONG_POWERS_OF_TEN_BIT_LENGTH.length; ++i) {
    188             LONG_POWERS_OF_TEN_BIT_LENGTH[i] = bitLength(MathUtils.LONG_POWERS_OF_TEN[i]);
    189         }
    190 
    191         // Taking the references of useful powers.
    192         TEN_POW = Multiplication.bigTenPows;
    193         FIVE_POW = Multiplication.bigFivePows;
    194     }
    195 
    196     /**
    197      * The constant zero as a {@code BigDecimal}.
    198      */
    199     public static final BigDecimal ZERO = new BigDecimal(0, 0);
    200 
    201     /**
    202      * The constant one as a {@code BigDecimal}.
    203      */
    204     public static final BigDecimal ONE = new BigDecimal(1, 0);
    205 
    206     /**
    207      * The constant ten as a {@code BigDecimal}.
    208      */
    209     public static final BigDecimal TEN = new BigDecimal(10, 0);
    210 
    211     /**
    212      * The arbitrary precision integer (unscaled value) in the internal
    213      * representation of {@code BigDecimal}.
    214      */
    215     private BigInteger intVal;
    216 
    217     private transient int bitLength;
    218 
    219     private transient long smallValue;
    220 
    221     /**
    222      * The 32-bit integer scale in the internal representation of {@code BigDecimal}.
    223      */
    224     private int scale;
    225 
    226     /**
    227      * Represent the number of decimal digits in the unscaled value. This
    228      * precision is calculated the first time, and used in the following calls
    229      * of method <code>precision()</code>. Note that some call to the private
    230      * method <code>inplaceRound()</code> could update this field.
    231      *
    232      * @see #precision()
    233      * @see #inplaceRound(MathContext)
    234      */
    235     private transient int precision = 0;
    236 
    237     private BigDecimal(long smallValue, int scale){
    238         this.smallValue = smallValue;
    239         this.scale = scale;
    240         this.bitLength = bitLength(smallValue);
    241     }
    242 
    243     private BigDecimal(int smallValue, int scale){
    244         this.smallValue = smallValue;
    245         this.scale = scale;
    246         this.bitLength = bitLength(smallValue);
    247     }
    248 
    249     /**
    250      * Constructs a new {@code BigDecimal} instance from a string representation
    251      * given as a character array.
    252      *
    253      * @param in
    254      *            array of characters containing the string representation of
    255      *            this {@code BigDecimal}.
    256      * @param offset
    257      *            first index to be copied.
    258      * @param len
    259      *            number of characters to be used.
    260      * @throws NumberFormatException
    261      *             if {@code offset < 0 || len <= 0 || offset+len-1 < 0 ||
    262      *             offset+len-1 >= in.length}, or if {@code in} does not
    263      *             contain a valid string representation of a big decimal.
    264      */
    265     public BigDecimal(char[] in, int offset, int len) {
    266         int begin = offset; // first index to be copied
    267         int last = offset + (len - 1); // last index to be copied
    268         String scaleString; // buffer for scale
    269         StringBuilder unscaledBuffer; // buffer for unscaled value
    270         long newScale; // the new scale
    271 
    272         if (in == null) {
    273             throw new NullPointerException("in == null");
    274         }
    275         if ((last >= in.length) || (offset < 0) || (len <= 0) || (last < 0)) {
    276             throw new NumberFormatException("Bad offset/length: offset=" + offset +
    277                     " len=" + len + " in.length=" + in.length);
    278         }
    279         unscaledBuffer = new StringBuilder(len);
    280         int bufLength = 0;
    281         // To skip a possible '+' symbol
    282         if ((offset <= last) && (in[offset] == '+')) {
    283             offset++;
    284             begin++;
    285         }
    286         int counter = 0;
    287         boolean wasNonZero = false;
    288         // Accumulating all digits until a possible decimal point
    289         for (; (offset <= last) && (in[offset] != '.') && (in[offset] != 'e') && (in[offset] != 'E'); offset++) {
    290             if (!wasNonZero) {
    291                 if (in[offset] == '0') {
    292                     counter++;
    293                 } else {
    294                     wasNonZero = true;
    295                 }
    296             }
    297 
    298         }
    299         unscaledBuffer.append(in, begin, offset - begin);
    300         bufLength += offset - begin;
    301         // A decimal point was found
    302         if ((offset <= last) && (in[offset] == '.')) {
    303             offset++;
    304             // Accumulating all digits until a possible exponent
    305             begin = offset;
    306             for (; (offset <= last) && (in[offset] != 'e')
    307             && (in[offset] != 'E'); offset++) {
    308                 if (!wasNonZero) {
    309                     if (in[offset] == '0') {
    310                         counter++;
    311                     } else {
    312                         wasNonZero = true;
    313                     }
    314                 }
    315             }
    316             scale = offset - begin;
    317             bufLength +=scale;
    318             unscaledBuffer.append(in, begin, scale);
    319         } else {
    320             scale = 0;
    321         }
    322         // An exponent was found
    323         if ((offset <= last) && ((in[offset] == 'e') || (in[offset] == 'E'))) {
    324             offset++;
    325             // Checking for a possible sign of scale
    326             begin = offset;
    327             if ((offset <= last) && (in[offset] == '+')) {
    328                 offset++;
    329                 if ((offset <= last) && (in[offset] != '-')) {
    330                     begin++;
    331                 }
    332             }
    333             // Accumulating all remaining digits
    334             scaleString = String.valueOf(in, begin, last + 1 - begin);
    335             // Checking if the scale is defined
    336             newScale = (long)scale - Integer.parseInt(scaleString);
    337             scale = (int)newScale;
    338             if (newScale != scale) {
    339                 throw new NumberFormatException("Scale out of range");
    340             }
    341         }
    342         // Parsing the unscaled value
    343         if (bufLength < 19) {
    344             smallValue = Long.parseLong(unscaledBuffer.toString());
    345             bitLength = bitLength(smallValue);
    346         } else {
    347             setUnscaledValue(new BigInteger(unscaledBuffer.toString()));
    348         }
    349     }
    350 
    351     /**
    352      * Constructs a new {@code BigDecimal} instance from a string representation
    353      * given as a character array.
    354      *
    355      * @param in
    356      *            array of characters containing the string representation of
    357      *            this {@code BigDecimal}.
    358      * @param offset
    359      *            first index to be copied.
    360      * @param len
    361      *            number of characters to be used.
    362      * @param mc
    363      *            rounding mode and precision for the result of this operation.
    364      * @throws NumberFormatException
    365      *             if {@code offset < 0 || len <= 0 || offset+len-1 < 0 ||
    366      *             offset+len-1 >= in.length}, or if {@code in} does not
    367      *             contain a valid string representation of a big decimal.
    368      * @throws ArithmeticException
    369      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    370      *             UNNECESSARY} and the new big decimal cannot be represented
    371      *             within the given precision without rounding.
    372      */
    373     public BigDecimal(char[] in, int offset, int len, MathContext mc) {
    374         this(in, offset, len);
    375         inplaceRound(mc);
    376     }
    377 
    378     /**
    379      * Constructs a new {@code BigDecimal} instance from a string representation
    380      * given as a character array.
    381      *
    382      * @param in
    383      *            array of characters containing the string representation of
    384      *            this {@code BigDecimal}.
    385      * @throws NumberFormatException
    386      *             if {@code in} does not contain a valid string representation
    387      *             of a big decimal.
    388      */
    389     public BigDecimal(char[] in) {
    390         this(in, 0, in.length);
    391     }
    392 
    393     /**
    394      * Constructs a new {@code BigDecimal} instance from a string representation
    395      * given as a character array. The result is rounded according to the
    396      * specified math context.
    397      *
    398      * @param in
    399      *            array of characters containing the string representation of
    400      *            this {@code BigDecimal}.
    401      * @param mc
    402      *            rounding mode and precision for the result of this operation.
    403      * @throws NumberFormatException
    404      *             if {@code in} does not contain a valid string representation
    405      *             of a big decimal.
    406      * @throws ArithmeticException
    407      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    408      *             UNNECESSARY} and the new big decimal cannot be represented
    409      *             within the given precision without rounding.
    410      */
    411     public BigDecimal(char[] in, MathContext mc) {
    412         this(in, 0, in.length);
    413         inplaceRound(mc);
    414     }
    415 
    416     /**
    417      * Constructs a new {@code BigDecimal} instance from a string
    418      * representation.
    419      *
    420      * @throws NumberFormatException
    421      *             if {@code val} does not contain a valid string representation
    422      *             of a big decimal.
    423      */
    424     public BigDecimal(String val) {
    425         this(val.toCharArray(), 0, val.length());
    426     }
    427 
    428     /**
    429      * Constructs a new {@code BigDecimal} instance from a string
    430      * representation. The result is rounded according to the specified math
    431      * context.
    432      *
    433      * @param mc
    434      *            rounding mode and precision for the result of this operation.
    435      * @throws NumberFormatException
    436      *             if {@code val} does not contain a valid string representation
    437      *             of a big decimal.
    438      * @throws ArithmeticException
    439      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    440      *             UNNECESSARY} and the new big decimal cannot be represented
    441      *             within the given precision without rounding.
    442      */
    443     public BigDecimal(String val, MathContext mc) {
    444         this(val.toCharArray(), 0, val.length());
    445         inplaceRound(mc);
    446     }
    447 
    448     /**
    449      * Constructs a new {@code BigDecimal} instance from the 64bit double
    450      * {@code val}. The constructed big decimal is equivalent to the given
    451      * double. For example, {@code new BigDecimal(0.1)} is equal to {@code
    452      * 0.1000000000000000055511151231257827021181583404541015625}. This happens
    453      * as {@code 0.1} cannot be represented exactly in binary.
    454      * <p>
    455      * To generate a big decimal instance which is equivalent to {@code 0.1} use
    456      * the {@code BigDecimal(String)} constructor.
    457      *
    458      * @param val
    459      *            double value to be converted to a {@code BigDecimal} instance.
    460      * @throws NumberFormatException
    461      *             if {@code val} is infinity or not a number.
    462      */
    463     public BigDecimal(double val) {
    464         if (Double.isInfinite(val) || Double.isNaN(val)) {
    465             throw new NumberFormatException("Infinity or NaN: " + val);
    466         }
    467         long bits = Double.doubleToLongBits(val); // IEEE-754
    468         long mantissa;
    469         int trailingZeros;
    470         // Extracting the exponent, note that the bias is 1023
    471         scale = 1075 - (int)((bits >> 52) & 0x7FFL);
    472         // Extracting the 52 bits of the mantissa.
    473         mantissa = (scale == 1075) ? (bits & 0xFFFFFFFFFFFFFL) << 1
    474                 : (bits & 0xFFFFFFFFFFFFFL) | 0x10000000000000L;
    475         if (mantissa == 0) {
    476             scale = 0;
    477             precision = 1;
    478         }
    479         // To simplify all factors '2' in the mantissa
    480         if (scale > 0) {
    481             trailingZeros = Math.min(scale, Long.numberOfTrailingZeros(mantissa));
    482             mantissa >>>= trailingZeros;
    483             scale -= trailingZeros;
    484         }
    485         // Calculating the new unscaled value and the new scale
    486         if((bits >> 63) != 0) {
    487             mantissa = -mantissa;
    488         }
    489         int mantissaBits = bitLength(mantissa);
    490         if (scale < 0) {
    491             bitLength = mantissaBits == 0 ? 0 : mantissaBits - scale;
    492             if(bitLength < 64) {
    493                 smallValue = mantissa << (-scale);
    494             } else {
    495                 BigInt bi = new BigInt();
    496                 bi.putLongInt(mantissa);
    497                 bi.shift(-scale);
    498                 intVal = new BigInteger(bi);
    499             }
    500             scale = 0;
    501         } else if (scale > 0) {
    502             // m * 2^e =  (m * 5^(-e)) * 10^e
    503             if(scale < LONG_FIVE_POW.length
    504                     && mantissaBits+LONG_FIVE_POW_BIT_LENGTH[scale] < 64) {
    505                 smallValue = mantissa * LONG_FIVE_POW[scale];
    506                 bitLength = bitLength(smallValue);
    507             } else {
    508                 setUnscaledValue(Multiplication.multiplyByFivePow(BigInteger.valueOf(mantissa), scale));
    509             }
    510         } else { // scale == 0
    511             smallValue = mantissa;
    512             bitLength = mantissaBits;
    513         }
    514     }
    515 
    516     /**
    517      * Constructs a new {@code BigDecimal} instance from the 64bit double
    518      * {@code val}. The constructed big decimal is equivalent to the given
    519      * double. For example, {@code new BigDecimal(0.1)} is equal to {@code
    520      * 0.1000000000000000055511151231257827021181583404541015625}. This happens
    521      * as {@code 0.1} cannot be represented exactly in binary.
    522      * <p>
    523      * To generate a big decimal instance which is equivalent to {@code 0.1} use
    524      * the {@code BigDecimal(String)} constructor.
    525      *
    526      * @param val
    527      *            double value to be converted to a {@code BigDecimal} instance.
    528      * @param mc
    529      *            rounding mode and precision for the result of this operation.
    530      * @throws NumberFormatException
    531      *             if {@code val} is infinity or not a number.
    532      * @throws ArithmeticException
    533      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    534      *             UNNECESSARY} and the new big decimal cannot be represented
    535      *             within the given precision without rounding.
    536      */
    537     public BigDecimal(double val, MathContext mc) {
    538         this(val);
    539         inplaceRound(mc);
    540     }
    541 
    542     /**
    543      * Constructs a new {@code BigDecimal} instance from the given big integer
    544      * {@code val}. The scale of the result is {@code 0}.
    545      */
    546     public BigDecimal(BigInteger val) {
    547         this(val, 0);
    548     }
    549 
    550     /**
    551      * Constructs a new {@code BigDecimal} instance from the given big integer
    552      * {@code val}. The scale of the result is {@code 0}.
    553      *
    554      * @param mc
    555      *            rounding mode and precision for the result of this operation.
    556      * @throws ArithmeticException
    557      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    558      *             UNNECESSARY} and the new big decimal cannot be represented
    559      *             within the given precision without rounding.
    560      */
    561     public BigDecimal(BigInteger val, MathContext mc) {
    562         this(val);
    563         inplaceRound(mc);
    564     }
    565 
    566     /**
    567      * Constructs a new {@code BigDecimal} instance from a given unscaled value
    568      * {@code unscaledVal} and a given scale. The value of this instance is
    569      * {@code unscaledVal * 10<sup>-scale</sup>}).
    570      *
    571      * @throws NullPointerException
    572      *             if {@code unscaledVal == null}.
    573      */
    574     public BigDecimal(BigInteger unscaledVal, int scale) {
    575         if (unscaledVal == null) {
    576             throw new NullPointerException("unscaledVal == null");
    577         }
    578         this.scale = scale;
    579         setUnscaledValue(unscaledVal);
    580     }
    581 
    582     /**
    583      * Constructs a new {@code BigDecimal} instance from a given unscaled value
    584      * {@code unscaledVal} and a given scale. The value of this instance is
    585      * {@code unscaledVal * 10<sup>-scale</sup>). The result is rounded according
    586      * to the specified math context.
    587      *
    588      * @param mc
    589      *            rounding mode and precision for the result of this operation.
    590      * @throws ArithmeticException
    591      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    592      *             UNNECESSARY} and the new big decimal cannot be represented
    593      *             within the given precision without rounding.
    594      * @throws NullPointerException
    595      *             if {@code unscaledVal == null}.
    596      */
    597     public BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) {
    598         this(unscaledVal, scale);
    599         inplaceRound(mc);
    600     }
    601 
    602     /**
    603      * Constructs a new {@code BigDecimal} instance from the given int
    604      * {@code val}. The scale of the result is 0.
    605      *
    606      * @param val
    607      *            int value to be converted to a {@code BigDecimal} instance.
    608      */
    609     public BigDecimal(int val) {
    610         this(val,0);
    611     }
    612 
    613     /**
    614      * Constructs a new {@code BigDecimal} instance from the given int {@code
    615      * val}. The scale of the result is {@code 0}. The result is rounded
    616      * according to the specified math context.
    617      *
    618      * @param val
    619      *            int value to be converted to a {@code BigDecimal} instance.
    620      * @param mc
    621      *            rounding mode and precision for the result of this operation.
    622      * @throws ArithmeticException
    623      *             if {@code mc.precision > 0} and {@code c.roundingMode ==
    624      *             UNNECESSARY} and the new big decimal cannot be represented
    625      *             within the given precision without rounding.
    626      */
    627     public BigDecimal(int val, MathContext mc) {
    628         this(val,0);
    629         inplaceRound(mc);
    630     }
    631 
    632     /**
    633      * Constructs a new {@code BigDecimal} instance from the given long {@code
    634      * val}. The scale of the result is {@code 0}.
    635      *
    636      * @param val
    637      *            long value to be converted to a {@code BigDecimal} instance.
    638      */
    639     public BigDecimal(long val) {
    640         this(val,0);
    641     }
    642 
    643     /**
    644      * Constructs a new {@code BigDecimal} instance from the given long {@code
    645      * val}. The scale of the result is {@code 0}. The result is rounded
    646      * according to the specified math context.
    647      *
    648      * @param val
    649      *            long value to be converted to a {@code BigDecimal} instance.
    650      * @param mc
    651      *            rounding mode and precision for the result of this operation.
    652      * @throws ArithmeticException
    653      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    654      *             UNNECESSARY} and the new big decimal cannot be represented
    655      *             within the given precision without rounding.
    656      */
    657     public BigDecimal(long val, MathContext mc) {
    658         this(val);
    659         inplaceRound(mc);
    660     }
    661 
    662     /* Public Methods */
    663 
    664     /**
    665      * Returns a new {@code BigDecimal} instance whose value is equal to {@code
    666      * unscaledVal * 10<sup>-scale</sup>}). The scale of the result is {@code
    667      * scale}, and its unscaled value is {@code unscaledVal}.
    668      */
    669     public static BigDecimal valueOf(long unscaledVal, int scale) {
    670         if (scale == 0) {
    671             return valueOf(unscaledVal);
    672         }
    673         if ((unscaledVal == 0) && (scale >= 0)
    674                 && (scale < ZERO_SCALED_BY.length)) {
    675             return ZERO_SCALED_BY[scale];
    676         }
    677         return new BigDecimal(unscaledVal, scale);
    678     }
    679 
    680     /**
    681      * Returns a new {@code BigDecimal} instance whose value is equal to {@code
    682      * unscaledVal}. The scale of the result is {@code 0}, and its unscaled
    683      * value is {@code unscaledVal}.
    684      *
    685      * @param unscaledVal
    686      *            value to be converted to a {@code BigDecimal}.
    687      * @return {@code BigDecimal} instance with the value {@code unscaledVal}.
    688      */
    689     public static BigDecimal valueOf(long unscaledVal) {
    690         if ((unscaledVal >= 0) && (unscaledVal < BI_SCALED_BY_ZERO_LENGTH)) {
    691             return BI_SCALED_BY_ZERO[(int)unscaledVal];
    692         }
    693         return new BigDecimal(unscaledVal,0);
    694     }
    695 
    696     /**
    697      * Returns a new {@code BigDecimal} instance whose value is equal to {@code
    698      * val}. The new decimal is constructed as if the {@code BigDecimal(String)}
    699      * constructor is called with an argument which is equal to {@code
    700      * Double.toString(val)}. For example, {@code valueOf("0.1")} is converted to
    701      * (unscaled=1, scale=1), although the double {@code 0.1} cannot be
    702      * represented exactly as a double value. In contrast to that, a new {@code
    703      * BigDecimal(0.1)} instance has the value {@code
    704      * 0.1000000000000000055511151231257827021181583404541015625} with an
    705      * unscaled value {@code 1000000000000000055511151231257827021181583404541015625}
    706      * and the scale {@code 55}.
    707      *
    708      * @param val
    709      *            double value to be converted to a {@code BigDecimal}.
    710      * @return {@code BigDecimal} instance with the value {@code val}.
    711      * @throws NumberFormatException
    712      *             if {@code val} is infinite or {@code val} is not a number
    713      */
    714     public static BigDecimal valueOf(double val) {
    715         if (Double.isInfinite(val) || Double.isNaN(val)) {
    716             throw new NumberFormatException("Infinity or NaN: " + val);
    717         }
    718         return new BigDecimal(Double.toString(val));
    719     }
    720 
    721     /**
    722      * Returns a new {@code BigDecimal} whose value is {@code this + augend}.
    723      * The scale of the result is the maximum of the scales of the two
    724      * arguments.
    725      *
    726      * @param augend
    727      *            value to be added to {@code this}.
    728      * @return {@code this + augend}.
    729      * @throws NullPointerException
    730      *             if {@code augend == null}.
    731      */
    732     public BigDecimal add(BigDecimal augend) {
    733         int diffScale = this.scale - augend.scale;
    734         // Fast return when some operand is zero
    735         if (this.isZero()) {
    736             if (diffScale <= 0) {
    737                 return augend;
    738             }
    739             if (augend.isZero()) {
    740                 return this;
    741             }
    742         } else if (augend.isZero()) {
    743             if (diffScale >= 0) {
    744                 return this;
    745             }
    746         }
    747         // Let be:  this = [u1,s1]  and  augend = [u2,s2]
    748         if (diffScale == 0) {
    749             // case s1 == s2: [u1 + u2 , s1]
    750             if (Math.max(this.bitLength, augend.bitLength) + 1 < 64) {
    751                 return valueOf(this.smallValue + augend.smallValue, this.scale);
    752             }
    753             return new BigDecimal(this.getUnscaledValue().add(augend.getUnscaledValue()), this.scale);
    754         } else if (diffScale > 0) {
    755             // case s1 > s2 : [(u1 + u2) * 10 ^ (s1 - s2) , s1]
    756             return addAndMult10(this, augend, diffScale);
    757         } else {// case s2 > s1 : [(u2 + u1) * 10 ^ (s2 - s1) , s2]
    758             return addAndMult10(augend, this, -diffScale);
    759         }
    760     }
    761 
    762     private static BigDecimal addAndMult10(BigDecimal thisValue,BigDecimal augend, int diffScale) {
    763         if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
    764                 Math.max(thisValue.bitLength,augend.bitLength+LONG_POWERS_OF_TEN_BIT_LENGTH[diffScale])+1<64) {
    765             return valueOf(thisValue.smallValue+augend.smallValue*MathUtils.LONG_POWERS_OF_TEN[diffScale],thisValue.scale);
    766         } else {
    767             BigInt bi = Multiplication.multiplyByTenPow(augend.getUnscaledValue(),diffScale).getBigInt();
    768             bi.add(thisValue.getUnscaledValue().getBigInt());
    769             return new BigDecimal(new BigInteger(bi), thisValue.scale);
    770         }
    771     }
    772 
    773     /**
    774      * Returns a new {@code BigDecimal} whose value is {@code this + augend}.
    775      * The result is rounded according to the passed context {@code mc}.
    776      *
    777      * @param augend
    778      *            value to be added to {@code this}.
    779      * @param mc
    780      *            rounding mode and precision for the result of this operation.
    781      * @return {@code this + augend}.
    782      * @throws NullPointerException
    783      *             if {@code augend == null} or {@code mc == null}.
    784      */
    785     public BigDecimal add(BigDecimal augend, MathContext mc) {
    786         BigDecimal larger; // operand with the largest unscaled value
    787         BigDecimal smaller; // operand with the smallest unscaled value
    788         BigInteger tempBI;
    789         long diffScale = (long)this.scale - augend.scale;
    790         int largerSignum;
    791         // Some operand is zero or the precision is infinity
    792         if ((augend.isZero()) || (this.isZero())
    793                 || (mc.getPrecision() == 0)) {
    794             return add(augend).round(mc);
    795         }
    796         // Cases where there is room for optimizations
    797         if (this.approxPrecision() < diffScale - 1) {
    798             larger = augend;
    799             smaller = this;
    800         } else if (augend.approxPrecision() < -diffScale - 1) {
    801             larger = this;
    802             smaller = augend;
    803         } else {// No optimization is done
    804             return add(augend).round(mc);
    805         }
    806         if (mc.getPrecision() >= larger.approxPrecision()) {
    807             // No optimization is done
    808             return add(augend).round(mc);
    809         }
    810         // Cases where it's unnecessary to add two numbers with very different scales
    811         largerSignum = larger.signum();
    812         if (largerSignum == smaller.signum()) {
    813             tempBI = Multiplication.multiplyByPositiveInt(larger.getUnscaledValue(),10)
    814             .add(BigInteger.valueOf(largerSignum));
    815         } else {
    816             tempBI = larger.getUnscaledValue().subtract(
    817                     BigInteger.valueOf(largerSignum));
    818             tempBI = Multiplication.multiplyByPositiveInt(tempBI,10)
    819             .add(BigInteger.valueOf(largerSignum * 9));
    820         }
    821         // Rounding the improved adding
    822         larger = new BigDecimal(tempBI, larger.scale + 1);
    823         return larger.round(mc);
    824     }
    825 
    826     /**
    827      * Returns a new {@code BigDecimal} whose value is {@code this - subtrahend}.
    828      * The scale of the result is the maximum of the scales of the two arguments.
    829      *
    830      * @param subtrahend
    831      *            value to be subtracted from {@code this}.
    832      * @return {@code this - subtrahend}.
    833      * @throws NullPointerException
    834      *             if {@code subtrahend == null}.
    835      */
    836     public BigDecimal subtract(BigDecimal subtrahend) {
    837         int diffScale = this.scale - subtrahend.scale;
    838         // Fast return when some operand is zero
    839         if (this.isZero()) {
    840             if (diffScale <= 0) {
    841                 return subtrahend.negate();
    842             }
    843             if (subtrahend.isZero()) {
    844                 return this;
    845             }
    846         } else if (subtrahend.isZero()) {
    847             if (diffScale >= 0) {
    848                 return this;
    849             }
    850         }
    851         // Let be: this = [u1,s1] and subtrahend = [u2,s2] so:
    852         if (diffScale == 0) {
    853             // case s1 = s2 : [u1 - u2 , s1]
    854             if (Math.max(this.bitLength, subtrahend.bitLength) + 1 < 64) {
    855                 return valueOf(this.smallValue - subtrahend.smallValue,this.scale);
    856             }
    857             return new BigDecimal(this.getUnscaledValue().subtract(subtrahend.getUnscaledValue()), this.scale);
    858         } else if (diffScale > 0) {
    859             // case s1 > s2 : [ u1 - u2 * 10 ^ (s1 - s2) , s1 ]
    860             if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
    861                     Math.max(this.bitLength,subtrahend.bitLength+LONG_POWERS_OF_TEN_BIT_LENGTH[diffScale])+1<64) {
    862                 return valueOf(this.smallValue-subtrahend.smallValue*MathUtils.LONG_POWERS_OF_TEN[diffScale],this.scale);
    863             }
    864             return new BigDecimal(this.getUnscaledValue().subtract(
    865                     Multiplication.multiplyByTenPow(subtrahend.getUnscaledValue(),diffScale)), this.scale);
    866         } else {// case s2 > s1 : [ u1 * 10 ^ (s2 - s1) - u2 , s2 ]
    867             diffScale = -diffScale;
    868             if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
    869                     Math.max(this.bitLength+LONG_POWERS_OF_TEN_BIT_LENGTH[diffScale],subtrahend.bitLength)+1<64) {
    870                 return valueOf(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[diffScale]-subtrahend.smallValue,subtrahend.scale);
    871             }
    872             return new BigDecimal(Multiplication.multiplyByTenPow(this.getUnscaledValue(),diffScale)
    873             .subtract(subtrahend.getUnscaledValue()), subtrahend.scale);
    874         }
    875     }
    876 
    877     /**
    878      * Returns a new {@code BigDecimal} whose value is {@code this - subtrahend}.
    879      * The result is rounded according to the passed context {@code mc}.
    880      *
    881      * @param subtrahend
    882      *            value to be subtracted from {@code this}.
    883      * @param mc
    884      *            rounding mode and precision for the result of this operation.
    885      * @return {@code this - subtrahend}.
    886      * @throws NullPointerException
    887      *             if {@code subtrahend == null} or {@code mc == null}.
    888      */
    889     public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) {
    890         long diffScale = subtrahend.scale - (long)this.scale;
    891         int thisSignum;
    892         BigDecimal leftOperand; // it will be only the left operand (this)
    893         BigInteger tempBI;
    894         // Some operand is zero or the precision is infinity
    895         if ((subtrahend.isZero()) || (this.isZero())
    896                 || (mc.getPrecision() == 0)) {
    897             return subtract(subtrahend).round(mc);
    898         }
    899         // Now:   this != 0   and   subtrahend != 0
    900         if (subtrahend.approxPrecision() < diffScale - 1) {
    901             // Cases where it is unnecessary to subtract two numbers with very different scales
    902             if (mc.getPrecision() < this.approxPrecision()) {
    903                 thisSignum = this.signum();
    904                 if (thisSignum != subtrahend.signum()) {
    905                     tempBI = Multiplication.multiplyByPositiveInt(this.getUnscaledValue(), 10)
    906                     .add(BigInteger.valueOf(thisSignum));
    907                 } else {
    908                     tempBI = this.getUnscaledValue().subtract(BigInteger.valueOf(thisSignum));
    909                     tempBI = Multiplication.multiplyByPositiveInt(tempBI, 10)
    910                     .add(BigInteger.valueOf(thisSignum * 9));
    911                 }
    912                 // Rounding the improved subtracting
    913                 leftOperand = new BigDecimal(tempBI, this.scale + 1);
    914                 return leftOperand.round(mc);
    915             }
    916         }
    917         // No optimization is done
    918         return subtract(subtrahend).round(mc);
    919     }
    920 
    921     /**
    922      * Returns a new {@code BigDecimal} whose value is {@code this *
    923      * multiplicand}. The scale of the result is the sum of the scales of the
    924      * two arguments.
    925      *
    926      * @param multiplicand
    927      *            value to be multiplied with {@code this}.
    928      * @return {@code this * multiplicand}.
    929      * @throws NullPointerException
    930      *             if {@code multiplicand == null}.
    931      */
    932     public BigDecimal multiply(BigDecimal multiplicand) {
    933         long newScale = (long)this.scale + multiplicand.scale;
    934 
    935         if ((this.isZero()) || (multiplicand.isZero())) {
    936             return zeroScaledBy(newScale);
    937         }
    938         /* Let be: this = [u1,s1] and multiplicand = [u2,s2] so:
    939          * this x multiplicand = [ s1 * s2 , s1 + s2 ] */
    940         if (this.bitLength + multiplicand.bitLength < 64) {
    941             long unscaledValue = this.smallValue * multiplicand.smallValue;
    942             // b/19185440 Case where result should be +2^63 but unscaledValue overflowed to -2^63
    943             boolean longMultiplicationOverflowed = (unscaledValue == Long.MIN_VALUE) &&
    944                     (Math.signum(smallValue) * Math.signum(multiplicand.smallValue) > 0);
    945             if (!longMultiplicationOverflowed) {
    946                 return valueOf(unscaledValue, safeLongToInt(newScale));
    947             }
    948         }
    949         return new BigDecimal(this.getUnscaledValue().multiply(
    950                 multiplicand.getUnscaledValue()), safeLongToInt(newScale));
    951     }
    952 
    953     /**
    954      * Returns a new {@code BigDecimal} whose value is {@code this *
    955      * multiplicand}. The result is rounded according to the passed context
    956      * {@code mc}.
    957      *
    958      * @param multiplicand
    959      *            value to be multiplied with {@code this}.
    960      * @param mc
    961      *            rounding mode and precision for the result of this operation.
    962      * @return {@code this * multiplicand}.
    963      * @throws NullPointerException
    964      *             if {@code multiplicand == null} or {@code mc == null}.
    965      */
    966     public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) {
    967         BigDecimal result = multiply(multiplicand);
    968 
    969         result.inplaceRound(mc);
    970         return result;
    971     }
    972 
    973     /**
    974      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
    975      * As scale of the result the parameter {@code scale} is used. If rounding
    976      * is required to meet the specified scale, then the specified rounding mode
    977      * {@code roundingMode} is applied.
    978      *
    979      * @param divisor
    980      *            value by which {@code this} is divided.
    981      * @param scale
    982      *            the scale of the result returned.
    983      * @param roundingMode
    984      *            rounding mode to be used to round the result.
    985      * @return {@code this / divisor} rounded according to the given rounding
    986      *         mode.
    987      * @throws NullPointerException
    988      *             if {@code divisor == null}.
    989      * @throws IllegalArgumentException
    990      *             if {@code roundingMode} is not a valid rounding mode.
    991      * @throws ArithmeticException
    992      *             if {@code divisor == 0}.
    993      * @throws ArithmeticException
    994      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
    995      *             necessary according to the given scale.
    996      */
    997     public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
    998         return divide(divisor, scale, RoundingMode.valueOf(roundingMode));
    999     }
   1000 
   1001     /**
   1002      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1003      * As scale of the result the parameter {@code scale} is used. If rounding
   1004      * is required to meet the specified scale, then the specified rounding mode
   1005      * {@code roundingMode} is applied.
   1006      *
   1007      * @param divisor
   1008      *            value by which {@code this} is divided.
   1009      * @param scale
   1010      *            the scale of the result returned.
   1011      * @param roundingMode
   1012      *            rounding mode to be used to round the result.
   1013      * @return {@code this / divisor} rounded according to the given rounding
   1014      *         mode.
   1015      * @throws NullPointerException
   1016      *             if {@code divisor == null} or {@code roundingMode == null}.
   1017      * @throws ArithmeticException
   1018      *             if {@code divisor == 0}.
   1019      * @throws ArithmeticException
   1020      *             if {@code roundingMode == RoundingMode.UNNECESSAR}Y and
   1021      *             rounding is necessary according to the given scale and given
   1022      *             precision.
   1023      */
   1024     public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
   1025         // Let be: this = [u1,s1]  and  divisor = [u2,s2]
   1026         if (roundingMode == null) {
   1027             throw new NullPointerException("roundingMode == null");
   1028         }
   1029         if (divisor.isZero()) {
   1030             throw new ArithmeticException("Division by zero");
   1031         }
   1032 
   1033         long diffScale = ((long)this.scale - divisor.scale) - scale;
   1034 
   1035         // Check whether the diffScale will fit into an int. See http://b/17393664.
   1036         if (bitLength(diffScale) > 32) {
   1037             throw new ArithmeticException(
   1038                     "Unable to perform divisor / dividend scaling: the difference in scale is too" +
   1039                             " big (" + diffScale + ")");
   1040         }
   1041 
   1042         if(this.bitLength < 64 && divisor.bitLength < 64 ) {
   1043             if(diffScale == 0) {
   1044                 // http://b/26105053 - corner case: Long.MIN_VALUE / (-1) overflows a long
   1045                 if (this.smallValue != Long.MIN_VALUE || divisor.smallValue != -1) {
   1046                     return dividePrimitiveLongs(this.smallValue,
   1047                             divisor.smallValue,
   1048                             scale,
   1049                             roundingMode);
   1050                 }
   1051             } else if(diffScale > 0) {
   1052                 if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   1053                         divisor.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)diffScale] < 64) {
   1054                     return dividePrimitiveLongs(this.smallValue,
   1055                             divisor.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)diffScale],
   1056                             scale,
   1057                             roundingMode);
   1058                 }
   1059             } else { // diffScale < 0
   1060                 if(-diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   1061                         this.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)-diffScale] < 64) {
   1062                     return dividePrimitiveLongs(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)-diffScale],
   1063                             divisor.smallValue,
   1064                             scale,
   1065                             roundingMode);
   1066                 }
   1067 
   1068             }
   1069         }
   1070         BigInteger scaledDividend = this.getUnscaledValue();
   1071         BigInteger scaledDivisor = divisor.getUnscaledValue(); // for scaling of 'u2'
   1072 
   1073         if (diffScale > 0) {
   1074             // Multiply 'u2'  by:  10^((s1 - s2) - scale)
   1075             scaledDivisor = Multiplication.multiplyByTenPow(scaledDivisor, (int)diffScale);
   1076         } else if (diffScale < 0) {
   1077             // Multiply 'u1'  by:  10^(scale - (s1 - s2))
   1078             scaledDividend  = Multiplication.multiplyByTenPow(scaledDividend, (int)-diffScale);
   1079         }
   1080         return divideBigIntegers(scaledDividend, scaledDivisor, scale, roundingMode);
   1081         }
   1082 
   1083     private static BigDecimal divideBigIntegers(BigInteger scaledDividend, BigInteger scaledDivisor, int scale, RoundingMode roundingMode) {
   1084 
   1085         BigInteger[] quotAndRem = scaledDividend.divideAndRemainder(scaledDivisor);  // quotient and remainder
   1086         // If after division there is a remainder...
   1087         BigInteger quotient = quotAndRem[0];
   1088         BigInteger remainder = quotAndRem[1];
   1089         if (remainder.signum() == 0) {
   1090             return new BigDecimal(quotient, scale);
   1091         }
   1092         int sign = scaledDividend.signum() * scaledDivisor.signum();
   1093         int compRem;                                      // 'compare to remainder'
   1094         if(scaledDivisor.bitLength() < 63) { // 63 in order to avoid out of long after *2
   1095             long rem = remainder.longValue();
   1096             long divisor = scaledDivisor.longValue();
   1097             compRem = compareForRounding(rem, divisor);
   1098             // To look if there is a carry
   1099             compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0,
   1100                     sign * (5 + compRem), roundingMode);
   1101 
   1102         } else {
   1103             // Checking if:  remainder * 2 >= scaledDivisor
   1104             compRem = remainder.abs().shiftLeftOneBit().compareTo(scaledDivisor.abs());
   1105             compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0,
   1106                     sign * (5 + compRem), roundingMode);
   1107         }
   1108             if (compRem != 0) {
   1109             if(quotient.bitLength() < 63) {
   1110                 return valueOf(quotient.longValue() + compRem,scale);
   1111             }
   1112             quotient = quotient.add(BigInteger.valueOf(compRem));
   1113             return new BigDecimal(quotient, scale);
   1114         }
   1115         // Constructing the result with the appropriate unscaled value
   1116         return new BigDecimal(quotient, scale);
   1117     }
   1118 
   1119     private static BigDecimal dividePrimitiveLongs(long scaledDividend, long scaledDivisor, int scale, RoundingMode roundingMode) {
   1120         long quotient = scaledDividend / scaledDivisor;
   1121         long remainder = scaledDividend % scaledDivisor;
   1122         int sign = Long.signum( scaledDividend ) * Long.signum( scaledDivisor );
   1123         if (remainder != 0) {
   1124             // Checking if:  remainder * 2 >= scaledDivisor
   1125             int compRem = compareForRounding(remainder, scaledDivisor); // 'compare to remainder'
   1126             // To look if there is a carry
   1127             quotient += roundingBehavior(((int)quotient) & 1,
   1128                     sign * (5 + compRem),
   1129                     roundingMode);
   1130         }
   1131         // Constructing the result with the appropriate unscaled value
   1132         return valueOf(quotient, scale);
   1133     }
   1134 
   1135     /**
   1136      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1137      * The scale of the result is the scale of {@code this}. If rounding is
   1138      * required to meet the specified scale, then the specified rounding mode
   1139      * {@code roundingMode} is applied.
   1140      *
   1141      * @param divisor
   1142      *            value by which {@code this} is divided.
   1143      * @param roundingMode
   1144      *            rounding mode to be used to round the result.
   1145      * @return {@code this / divisor} rounded according to the given rounding
   1146      *         mode.
   1147      * @throws NullPointerException
   1148      *             if {@code divisor == null}.
   1149      * @throws IllegalArgumentException
   1150      *             if {@code roundingMode} is not a valid rounding mode.
   1151      * @throws ArithmeticException
   1152      *             if {@code divisor == 0}.
   1153      * @throws ArithmeticException
   1154      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
   1155      *             necessary according to the scale of this.
   1156      */
   1157     public BigDecimal divide(BigDecimal divisor, int roundingMode) {
   1158         return divide(divisor, scale, RoundingMode.valueOf(roundingMode));
   1159     }
   1160 
   1161     /**
   1162      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1163      * The scale of the result is the scale of {@code this}. If rounding is
   1164      * required to meet the specified scale, then the specified rounding mode
   1165      * {@code roundingMode} is applied.
   1166      *
   1167      * @param divisor
   1168      *            value by which {@code this} is divided.
   1169      * @param roundingMode
   1170      *            rounding mode to be used to round the result.
   1171      * @return {@code this / divisor} rounded according to the given rounding
   1172      *         mode.
   1173      * @throws NullPointerException
   1174      *             if {@code divisor == null} or {@code roundingMode == null}.
   1175      * @throws ArithmeticException
   1176      *             if {@code divisor == 0}.
   1177      * @throws ArithmeticException
   1178      *             if {@code roundingMode == RoundingMode.UNNECESSARY} and
   1179      *             rounding is necessary according to the scale of this.
   1180      */
   1181     public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) {
   1182         return divide(divisor, scale, roundingMode);
   1183     }
   1184 
   1185     /**
   1186      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1187      * The scale of the result is the difference of the scales of {@code this}
   1188      * and {@code divisor}. If the exact result requires more digits, then the
   1189      * scale is adjusted accordingly. For example, {@code 1/128 = 0.0078125}
   1190      * which has a scale of {@code 7} and precision {@code 5}.
   1191      *
   1192      * @param divisor
   1193      *            value by which {@code this} is divided.
   1194      * @return {@code this / divisor}.
   1195      * @throws NullPointerException
   1196      *             if {@code divisor == null}.
   1197      * @throws ArithmeticException
   1198      *             if {@code divisor == 0}.
   1199      * @throws ArithmeticException
   1200      *             if the result cannot be represented exactly.
   1201      */
   1202     public BigDecimal divide(BigDecimal divisor) {
   1203         BigInteger p = this.getUnscaledValue();
   1204         BigInteger q = divisor.getUnscaledValue();
   1205         BigInteger gcd; // greatest common divisor between 'p' and 'q'
   1206         BigInteger quotAndRem[];
   1207         long diffScale = (long)scale - divisor.scale;
   1208         int newScale; // the new scale for final quotient
   1209         int k; // number of factors "2" in 'q'
   1210         int l = 0; // number of factors "5" in 'q'
   1211         int i = 1;
   1212         int lastPow = FIVE_POW.length - 1;
   1213 
   1214         if (divisor.isZero()) {
   1215             throw new ArithmeticException("Division by zero");
   1216         }
   1217         if (p.signum() == 0) {
   1218             return zeroScaledBy(diffScale);
   1219         }
   1220         // To divide both by the GCD
   1221         gcd = p.gcd(q);
   1222         p = p.divide(gcd);
   1223         q = q.divide(gcd);
   1224         // To simplify all "2" factors of q, dividing by 2^k
   1225         k = q.getLowestSetBit();
   1226         q = q.shiftRight(k);
   1227         // To simplify all "5" factors of q, dividing by 5^l
   1228         do {
   1229             quotAndRem = q.divideAndRemainder(FIVE_POW[i]);
   1230             if (quotAndRem[1].signum() == 0) {
   1231                 l += i;
   1232                 if (i < lastPow) {
   1233                     i++;
   1234                 }
   1235                 q = quotAndRem[0];
   1236             } else {
   1237                 if (i == 1) {
   1238                     break;
   1239                 }
   1240                 i = 1;
   1241             }
   1242         } while (true);
   1243         // If  abs(q) != 1  then the quotient is periodic
   1244         if (!q.abs().equals(BigInteger.ONE)) {
   1245             throw new ArithmeticException("Non-terminating decimal expansion; no exact representable decimal result");
   1246         }
   1247         // The sign of the is fixed and the quotient will be saved in 'p'
   1248         if (q.signum() < 0) {
   1249             p = p.negate();
   1250         }
   1251         // Checking if the new scale is out of range
   1252         newScale = safeLongToInt(diffScale + Math.max(k, l));
   1253         // k >= 0  and  l >= 0  implies that  k - l  is in the 32-bit range
   1254         i = k - l;
   1255 
   1256         p = (i > 0) ? Multiplication.multiplyByFivePow(p, i)
   1257         : p.shiftLeft(-i);
   1258         return new BigDecimal(p, newScale);
   1259     }
   1260 
   1261     /**
   1262      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1263      * The result is rounded according to the passed context {@code mc}. If the
   1264      * passed math context specifies precision {@code 0}, then this call is
   1265      * equivalent to {@code this.divide(divisor)}.
   1266      *
   1267      * @param divisor
   1268      *            value by which {@code this} is divided.
   1269      * @param mc
   1270      *            rounding mode and precision for the result of this operation.
   1271      * @return {@code this / divisor}.
   1272      * @throws NullPointerException
   1273      *             if {@code divisor == null} or {@code mc == null}.
   1274      * @throws ArithmeticException
   1275      *             if {@code divisor == 0}.
   1276      * @throws ArithmeticException
   1277      *             if {@code mc.getRoundingMode() == UNNECESSARY} and rounding
   1278      *             is necessary according {@code mc.getPrecision()}.
   1279      */
   1280     public BigDecimal divide(BigDecimal divisor, MathContext mc) {
   1281         /* Calculating how many zeros must be append to 'dividend'
   1282          * to obtain a  quotient with at least 'mc.precision()' digits */
   1283         long trailingZeros = mc.getPrecision() + 2L
   1284                 + divisor.approxPrecision() - approxPrecision();
   1285         long diffScale = (long)scale - divisor.scale;
   1286         long newScale = diffScale; // scale of the final quotient
   1287         int compRem; // to compare the remainder
   1288         int i = 1; // index
   1289         int lastPow = TEN_POW.length - 1; // last power of ten
   1290         BigInteger integerQuot; // for temporal results
   1291         BigInteger quotAndRem[] = {getUnscaledValue()};
   1292         // In special cases it reduces the problem to call the dual method
   1293         if ((mc.getPrecision() == 0) || (this.isZero())
   1294         || (divisor.isZero())) {
   1295             return this.divide(divisor);
   1296         }
   1297         if (trailingZeros > 0) {
   1298             // To append trailing zeros at end of dividend
   1299             quotAndRem[0] = getUnscaledValue().multiply( Multiplication.powerOf10(trailingZeros) );
   1300             newScale += trailingZeros;
   1301         }
   1302         quotAndRem = quotAndRem[0].divideAndRemainder( divisor.getUnscaledValue() );
   1303         integerQuot = quotAndRem[0];
   1304         // Calculating the exact quotient with at least 'mc.precision()' digits
   1305         if (quotAndRem[1].signum() != 0) {
   1306             // Checking if:   2 * remainder >= divisor ?
   1307             compRem = quotAndRem[1].shiftLeftOneBit().compareTo( divisor.getUnscaledValue() );
   1308             // quot := quot * 10 + r;     with 'r' in {-6,-5,-4, 0,+4,+5,+6}
   1309             integerQuot = integerQuot.multiply(BigInteger.TEN)
   1310             .add(BigInteger.valueOf(quotAndRem[0].signum() * (5 + compRem)));
   1311             newScale++;
   1312         } else {
   1313             // To strip trailing zeros until the preferred scale is reached
   1314             while (!integerQuot.testBit(0)) {
   1315                 quotAndRem = integerQuot.divideAndRemainder(TEN_POW[i]);
   1316                 if ((quotAndRem[1].signum() == 0)
   1317                         && (newScale - i >= diffScale)) {
   1318                     newScale -= i;
   1319                     if (i < lastPow) {
   1320                         i++;
   1321                     }
   1322                     integerQuot = quotAndRem[0];
   1323                 } else {
   1324                     if (i == 1) {
   1325                         break;
   1326                     }
   1327                     i = 1;
   1328                 }
   1329             }
   1330         }
   1331         // To perform rounding
   1332         return new BigDecimal(integerQuot, safeLongToInt(newScale), mc);
   1333     }
   1334 
   1335     /**
   1336      * Returns a new {@code BigDecimal} whose value is the integral part of
   1337      * {@code this / divisor}. The quotient is rounded down towards zero to the
   1338      * next integer. For example, {@code 0.5/0.2 = 2}.
   1339      *
   1340      * @param divisor
   1341      *            value by which {@code this} is divided.
   1342      * @return integral part of {@code this / divisor}.
   1343      * @throws NullPointerException
   1344      *             if {@code divisor == null}.
   1345      * @throws ArithmeticException
   1346      *             if {@code divisor == 0}.
   1347      */
   1348     public BigDecimal divideToIntegralValue(BigDecimal divisor) {
   1349         BigInteger integralValue; // the integer of result
   1350         BigInteger powerOfTen; // some power of ten
   1351 
   1352         long newScale = (long)this.scale - divisor.scale;
   1353         long tempScale = 0;
   1354         int i = 1;
   1355         int lastPow = TEN_POW.length - 1;
   1356 
   1357         if (divisor.isZero()) {
   1358             throw new ArithmeticException("Division by zero");
   1359         }
   1360         if ((divisor.approxPrecision() + newScale > this.approxPrecision() + 1L)
   1361         || (this.isZero())) {
   1362             /* If the divisor's integer part is greater than this's integer part,
   1363              * the result must be zero with the appropriate scale */
   1364             integralValue = BigInteger.ZERO;
   1365         } else if (newScale == 0) {
   1366             integralValue = getUnscaledValue().divide( divisor.getUnscaledValue() );
   1367         } else if (newScale > 0) {
   1368             powerOfTen = Multiplication.powerOf10(newScale);
   1369             integralValue = getUnscaledValue().divide( divisor.getUnscaledValue().multiply(powerOfTen) );
   1370             integralValue = integralValue.multiply(powerOfTen);
   1371         } else {// (newScale < 0)
   1372             powerOfTen = Multiplication.powerOf10(-newScale);
   1373             integralValue = getUnscaledValue().multiply(powerOfTen).divide( divisor.getUnscaledValue() );
   1374             // To strip trailing zeros approximating to the preferred scale
   1375             while (!integralValue.testBit(0)) {
   1376                 BigInteger[] quotAndRem = integralValue.divideAndRemainder(TEN_POW[i]);
   1377                 if ((quotAndRem[1].signum() == 0)
   1378                         && (tempScale - i >= newScale)) {
   1379                     tempScale -= i;
   1380                     if (i < lastPow) {
   1381                         i++;
   1382                     }
   1383                     integralValue = quotAndRem[0];
   1384                 } else {
   1385                     if (i == 1) {
   1386                         break;
   1387                     }
   1388                     i = 1;
   1389                 }
   1390             }
   1391             newScale = tempScale;
   1392         }
   1393         return ((integralValue.signum() == 0)
   1394         ? zeroScaledBy(newScale)
   1395                 : new BigDecimal(integralValue, safeLongToInt(newScale)));
   1396     }
   1397 
   1398     /**
   1399      * Returns a new {@code BigDecimal} whose value is the integral part of
   1400      * {@code this / divisor}. The quotient is rounded down towards zero to the
   1401      * next integer. The rounding mode passed with the parameter {@code mc} is
   1402      * not considered. But if the precision of {@code mc > 0} and the integral
   1403      * part requires more digits, then an {@code ArithmeticException} is thrown.
   1404      *
   1405      * @param divisor
   1406      *            value by which {@code this} is divided.
   1407      * @param mc
   1408      *            math context which determines the maximal precision of the
   1409      *            result.
   1410      * @return integral part of {@code this / divisor}.
   1411      * @throws NullPointerException
   1412      *             if {@code divisor == null} or {@code mc == null}.
   1413      * @throws ArithmeticException
   1414      *             if {@code divisor == 0}.
   1415      * @throws ArithmeticException
   1416      *             if {@code mc.getPrecision() > 0} and the result requires more
   1417      *             digits to be represented.
   1418      */
   1419     public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) {
   1420         int mcPrecision = mc.getPrecision();
   1421         int diffPrecision = this.precision() - divisor.precision();
   1422         int lastPow = TEN_POW.length - 1;
   1423         long diffScale = (long)this.scale - divisor.scale;
   1424         long newScale = diffScale;
   1425         long quotPrecision = diffPrecision - diffScale + 1;
   1426         BigInteger quotAndRem[] = new BigInteger[2];
   1427         // In special cases it call the dual method
   1428         if ((mcPrecision == 0) || (this.isZero()) || (divisor.isZero())) {
   1429             return this.divideToIntegralValue(divisor);
   1430         }
   1431         // Let be:   this = [u1,s1]   and   divisor = [u2,s2]
   1432         if (quotPrecision <= 0) {
   1433             quotAndRem[0] = BigInteger.ZERO;
   1434         } else if (diffScale == 0) {
   1435             // CASE s1 == s2:  to calculate   u1 / u2
   1436             quotAndRem[0] = this.getUnscaledValue().divide( divisor.getUnscaledValue() );
   1437         } else if (diffScale > 0) {
   1438             // CASE s1 >= s2:  to calculate   u1 / (u2 * 10^(s1-s2)
   1439             quotAndRem[0] = this.getUnscaledValue().divide(
   1440                     divisor.getUnscaledValue().multiply(Multiplication.powerOf10(diffScale)) );
   1441             // To chose  10^newScale  to get a quotient with at least 'mc.precision()' digits
   1442             newScale = Math.min(diffScale, Math.max(mcPrecision - quotPrecision + 1, 0));
   1443             // To calculate: (u1 / (u2 * 10^(s1-s2)) * 10^newScale
   1444             quotAndRem[0] = quotAndRem[0].multiply(Multiplication.powerOf10(newScale));
   1445         } else {// CASE s2 > s1:
   1446             /* To calculate the minimum power of ten, such that the quotient
   1447              *   (u1 * 10^exp) / u2   has at least 'mc.precision()' digits. */
   1448             long exp = Math.min(-diffScale, Math.max((long)mcPrecision - diffPrecision, 0));
   1449             long compRemDiv;
   1450             // Let be:   (u1 * 10^exp) / u2 = [q,r]
   1451             quotAndRem = this.getUnscaledValue().multiply(Multiplication.powerOf10(exp)).
   1452                     divideAndRemainder(divisor.getUnscaledValue());
   1453             newScale += exp; // To fix the scale
   1454             exp = -newScale; // The remaining power of ten
   1455             // If after division there is a remainder...
   1456             if ((quotAndRem[1].signum() != 0) && (exp > 0)) {
   1457                 // Log10(r) + ((s2 - s1) - exp) > mc.precision ?
   1458                 compRemDiv = (new BigDecimal(quotAndRem[1])).precision()
   1459                 + exp - divisor.precision();
   1460                 if (compRemDiv == 0) {
   1461                     // To calculate:  (r * 10^exp2) / u2
   1462                     quotAndRem[1] = quotAndRem[1].multiply(Multiplication.powerOf10(exp)).
   1463                             divide(divisor.getUnscaledValue());
   1464                     compRemDiv = Math.abs(quotAndRem[1].signum());
   1465                 }
   1466                 if (compRemDiv > 0) {
   1467                     throw new ArithmeticException("Division impossible");
   1468                 }
   1469             }
   1470         }
   1471         // Fast return if the quotient is zero
   1472         if (quotAndRem[0].signum() == 0) {
   1473             return zeroScaledBy(diffScale);
   1474         }
   1475         BigInteger strippedBI = quotAndRem[0];
   1476         BigDecimal integralValue = new BigDecimal(quotAndRem[0]);
   1477         long resultPrecision = integralValue.precision();
   1478         int i = 1;
   1479         // To strip trailing zeros until the specified precision is reached
   1480         while (!strippedBI.testBit(0)) {
   1481             quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
   1482             if ((quotAndRem[1].signum() == 0) &&
   1483                     ((resultPrecision - i >= mcPrecision)
   1484                     || (newScale - i >= diffScale)) ) {
   1485                 resultPrecision -= i;
   1486                 newScale -= i;
   1487                 if (i < lastPow) {
   1488                     i++;
   1489                 }
   1490                 strippedBI = quotAndRem[0];
   1491             } else {
   1492                 if (i == 1) {
   1493                     break;
   1494                 }
   1495                 i = 1;
   1496             }
   1497         }
   1498         // To check if the result fit in 'mc.precision()' digits
   1499         if (resultPrecision > mcPrecision) {
   1500             throw new ArithmeticException("Division impossible");
   1501         }
   1502         integralValue.scale = safeLongToInt(newScale);
   1503         integralValue.setUnscaledValue(strippedBI);
   1504         return integralValue;
   1505     }
   1506 
   1507     /**
   1508      * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
   1509      * <p>
   1510      * The remainder is defined as {@code this -
   1511      * this.divideToIntegralValue(divisor) * divisor}.
   1512      *
   1513      * @param divisor
   1514      *            value by which {@code this} is divided.
   1515      * @return {@code this % divisor}.
   1516      * @throws NullPointerException
   1517      *             if {@code divisor == null}.
   1518      * @throws ArithmeticException
   1519      *             if {@code divisor == 0}.
   1520      */
   1521     public BigDecimal remainder(BigDecimal divisor) {
   1522         return divideAndRemainder(divisor)[1];
   1523     }
   1524 
   1525     /**
   1526      * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
   1527      * <p>
   1528      * The remainder is defined as {@code this -
   1529      * this.divideToIntegralValue(divisor) * divisor}.
   1530      * <p>
   1531      * The specified rounding mode {@code mc} is used for the division only.
   1532      *
   1533      * @param divisor
   1534      *            value by which {@code this} is divided.
   1535      * @param mc
   1536      *            rounding mode and precision to be used.
   1537      * @return {@code this % divisor}.
   1538      * @throws NullPointerException
   1539      *             if {@code divisor == null}.
   1540      * @throws ArithmeticException
   1541      *             if {@code divisor == 0}.
   1542      * @throws ArithmeticException
   1543      *             if {@code mc.getPrecision() > 0} and the result of {@code
   1544      *             this.divideToIntegralValue(divisor, mc)} requires more digits
   1545      *             to be represented.
   1546      */
   1547     public BigDecimal remainder(BigDecimal divisor, MathContext mc) {
   1548         return divideAndRemainder(divisor, mc)[1];
   1549     }
   1550 
   1551     /**
   1552      * Returns a {@code BigDecimal} array which contains the integral part of
   1553      * {@code this / divisor} at index 0 and the remainder {@code this %
   1554      * divisor} at index 1. The quotient is rounded down towards zero to the
   1555      * next integer.
   1556      *
   1557      * @param divisor
   1558      *            value by which {@code this} is divided.
   1559      * @return {@code [this.divideToIntegralValue(divisor),
   1560      *         this.remainder(divisor)]}.
   1561      * @throws NullPointerException
   1562      *             if {@code divisor == null}.
   1563      * @throws ArithmeticException
   1564      *             if {@code divisor == 0}.
   1565      * @see #divideToIntegralValue
   1566      * @see #remainder
   1567      */
   1568     public BigDecimal[] divideAndRemainder(BigDecimal divisor) {
   1569         BigDecimal quotAndRem[] = new BigDecimal[2];
   1570 
   1571         quotAndRem[0] = this.divideToIntegralValue(divisor);
   1572         quotAndRem[1] = this.subtract( quotAndRem[0].multiply(divisor) );
   1573         return quotAndRem;
   1574     }
   1575 
   1576     /**
   1577      * Returns a {@code BigDecimal} array which contains the integral part of
   1578      * {@code this / divisor} at index 0 and the remainder {@code this %
   1579      * divisor} at index 1. The quotient is rounded down towards zero to the
   1580      * next integer. The rounding mode passed with the parameter {@code mc} is
   1581      * not considered. But if the precision of {@code mc > 0} and the integral
   1582      * part requires more digits, then an {@code ArithmeticException} is thrown.
   1583      *
   1584      * @param divisor
   1585      *            value by which {@code this} is divided.
   1586      * @param mc
   1587      *            math context which determines the maximal precision of the
   1588      *            result.
   1589      * @return {@code [this.divideToIntegralValue(divisor),
   1590      *         this.remainder(divisor)]}.
   1591      * @throws NullPointerException
   1592      *             if {@code divisor == null}.
   1593      * @throws ArithmeticException
   1594      *             if {@code divisor == 0}.
   1595      * @see #divideToIntegralValue
   1596      * @see #remainder
   1597      */
   1598     public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) {
   1599         BigDecimal quotAndRem[] = new BigDecimal[2];
   1600 
   1601         quotAndRem[0] = this.divideToIntegralValue(divisor, mc);
   1602         quotAndRem[1] = this.subtract( quotAndRem[0].multiply(divisor) );
   1603         return quotAndRem;
   1604     }
   1605 
   1606     /**
   1607      * Returns a new {@code BigDecimal} whose value is {@code this<sup>n</sup>}. The
   1608      * scale of the result is {@code n * this.scale()}.
   1609      *
   1610      * <p>{@code x.pow(0)} returns {@code 1}, even if {@code x == 0}.
   1611      *
   1612      * <p>Implementation Note: The implementation is based on the ANSI standard
   1613      * X3.274-1996 algorithm.
   1614      *
   1615      * @throws ArithmeticException
   1616      *             if {@code n < 0} or {@code n > 999999999}.
   1617      */
   1618     public BigDecimal pow(int n) {
   1619         if (n == 0) {
   1620             return ONE;
   1621         }
   1622         if ((n < 0) || (n > 999999999)) {
   1623             throw new ArithmeticException("Invalid operation");
   1624         }
   1625         long newScale = scale * (long)n;
   1626         // Let be: this = [u,s]   so:  this^n = [u^n, s*n]
   1627         return isZero() ? zeroScaledBy(newScale)
   1628                 : new BigDecimal(getUnscaledValue().pow(n), safeLongToInt(newScale));
   1629     }
   1630 
   1631     /**
   1632      * Returns a new {@code BigDecimal} whose value is {@code this<sup>n</sup>}. The
   1633      * result is rounded according to the passed context {@code mc}.
   1634      *
   1635      * <p>Implementation Note: The implementation is based on the ANSI standard
   1636      * X3.274-1996 algorithm.
   1637      *
   1638      * @param mc
   1639      *            rounding mode and precision for the result of this operation.
   1640      * @throws ArithmeticException
   1641      *             if {@code n < 0} or {@code n > 999999999}.
   1642      */
   1643     public BigDecimal pow(int n, MathContext mc) {
   1644         // The ANSI standard X3.274-1996 algorithm
   1645         int m = Math.abs(n);
   1646         int mcPrecision = mc.getPrecision();
   1647         int elength = (int)Math.log10(m) + 1;   // decimal digits in 'n'
   1648         int oneBitMask; // mask of bits
   1649         BigDecimal accum; // the single accumulator
   1650         MathContext newPrecision = mc; // MathContext by default
   1651 
   1652         // In particular cases, it reduces the problem to call the other 'pow()'
   1653         if ((n == 0) || ((isZero()) && (n > 0))) {
   1654             return pow(n);
   1655         }
   1656         if ((m > 999999999) || ((mcPrecision == 0) && (n < 0))
   1657                 || ((mcPrecision > 0) && (elength > mcPrecision))) {
   1658             throw new ArithmeticException("Invalid operation");
   1659         }
   1660         if (mcPrecision > 0) {
   1661             newPrecision = new MathContext( mcPrecision + elength + 1,
   1662                     mc.getRoundingMode());
   1663         }
   1664         // The result is calculated as if 'n' were positive
   1665         accum = round(newPrecision);
   1666         oneBitMask = Integer.highestOneBit(m) >> 1;
   1667 
   1668         while (oneBitMask > 0) {
   1669             accum = accum.multiply(accum, newPrecision);
   1670             if ((m & oneBitMask) == oneBitMask) {
   1671                 accum = accum.multiply(this, newPrecision);
   1672             }
   1673             oneBitMask >>= 1;
   1674         }
   1675         // If 'n' is negative, the value is divided into 'ONE'
   1676         if (n < 0) {
   1677             accum = ONE.divide(accum, newPrecision);
   1678         }
   1679         // The final value is rounded to the destination precision
   1680         accum.inplaceRound(mc);
   1681         return accum;
   1682     }
   1683 
   1684     /**
   1685      * Returns a {@code BigDecimal} whose value is the absolute value of
   1686      * {@code this}. The scale of the result is the same as the scale of this.
   1687      */
   1688     public BigDecimal abs() {
   1689         return ((signum() < 0) ? negate() : this);
   1690     }
   1691 
   1692     /**
   1693      * Returns a {@code BigDecimal} whose value is the absolute value of
   1694      * {@code this}. The result is rounded according to the passed context
   1695      * {@code mc}.
   1696      */
   1697     public BigDecimal abs(MathContext mc) {
   1698         BigDecimal result = (signum() < 0) ? negate() : new BigDecimal(getUnscaledValue(), scale);
   1699         result.inplaceRound(mc);
   1700         return result;
   1701     }
   1702 
   1703     /**
   1704      * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
   1705      * scale of the result is the same as the scale of this.
   1706      *
   1707      * @return {@code -this}
   1708      */
   1709     public BigDecimal negate() {
   1710         if(bitLength < 63 || (bitLength == 63 && smallValue!=Long.MIN_VALUE)) {
   1711             return valueOf(-smallValue,scale);
   1712         }
   1713         return new BigDecimal(getUnscaledValue().negate(), scale);
   1714     }
   1715 
   1716     /**
   1717      * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
   1718      * result is rounded according to the passed context {@code mc}.
   1719      *
   1720      * @param mc
   1721      *            rounding mode and precision for the result of this operation.
   1722      * @return {@code -this}
   1723      */
   1724     public BigDecimal negate(MathContext mc) {
   1725         BigDecimal result = negate();
   1726         result.inplaceRound(mc);
   1727         return result;
   1728     }
   1729 
   1730     /**
   1731      * Returns a new {@code BigDecimal} whose value is {@code +this}. The scale
   1732      * of the result is the same as the scale of this.
   1733      *
   1734      * @return {@code this}
   1735      */
   1736     public BigDecimal plus() {
   1737         return this;
   1738     }
   1739 
   1740     /**
   1741      * Returns a new {@code BigDecimal} whose value is {@code +this}. The result
   1742      * is rounded according to the passed context {@code mc}.
   1743      *
   1744      * @param mc
   1745      *            rounding mode and precision for the result of this operation.
   1746      * @return {@code this}, rounded
   1747      */
   1748     public BigDecimal plus(MathContext mc) {
   1749         return round(mc);
   1750     }
   1751 
   1752     /**
   1753      * Returns the sign of this {@code BigDecimal}.
   1754      *
   1755      * @return {@code -1} if {@code this < 0},
   1756      *         {@code 0} if {@code this == 0},
   1757      *         {@code 1} if {@code this > 0}.
   1758      */
   1759     public int signum() {
   1760         if( bitLength < 64) {
   1761             return Long.signum( this.smallValue );
   1762         }
   1763         return getUnscaledValue().signum();
   1764     }
   1765 
   1766     private boolean isZero() {
   1767         //Watch out: -1 has a bitLength=0
   1768         return bitLength == 0 && this.smallValue != -1;
   1769     }
   1770 
   1771     /**
   1772      * Returns the scale of this {@code BigDecimal}. The scale is the number of
   1773      * digits behind the decimal point. The value of this {@code BigDecimal} is
   1774      * the {@code unsignedValue * 10<sup>-scale</sup>}. If the scale is negative,
   1775      * then this {@code BigDecimal} represents a big integer.
   1776      *
   1777      * @return the scale of this {@code BigDecimal}.
   1778      */
   1779     public int scale() {
   1780         return scale;
   1781     }
   1782 
   1783     /**
   1784      * Returns the precision of this {@code BigDecimal}. The precision is the
   1785      * number of decimal digits used to represent this decimal. It is equivalent
   1786      * to the number of digits of the unscaled value. The precision of {@code 0}
   1787      * is {@code 1} (independent of the scale).
   1788      *
   1789      * @return the precision of this {@code BigDecimal}.
   1790      */
   1791     public int precision() {
   1792         // Return the cached value if we have one.
   1793         if (precision != 0) {
   1794             return precision;
   1795         }
   1796 
   1797         if (bitLength == 0) {
   1798             precision = 1;
   1799         } else if (bitLength < 64) {
   1800             precision = decimalDigitsInLong(smallValue);
   1801         } else {
   1802             int decimalDigits = 1 + (int) ((bitLength - 1) * LOG10_2);
   1803             // If after division the number isn't zero, there exists an additional digit
   1804             if (getUnscaledValue().divide(Multiplication.powerOf10(decimalDigits)).signum() != 0) {
   1805                 decimalDigits++;
   1806             }
   1807             precision = decimalDigits;
   1808         }
   1809         return precision;
   1810     }
   1811 
   1812     private int decimalDigitsInLong(long value) {
   1813         if (value == Long.MIN_VALUE) {
   1814             return 19; // special case required because abs(MIN_VALUE) == MIN_VALUE
   1815         } else {
   1816             int index = Arrays.binarySearch(MathUtils.LONG_POWERS_OF_TEN, Math.abs(value));
   1817             return (index < 0) ? (-index - 1) : (index + 1);
   1818         }
   1819     }
   1820 
   1821     /**
   1822      * Returns the unscaled value (mantissa) of this {@code BigDecimal} instance
   1823      * as a {@code BigInteger}. The unscaled value can be computed as
   1824      * {@code this * 10<sup>scale</sup>}.
   1825      */
   1826     public BigInteger unscaledValue() {
   1827         return getUnscaledValue();
   1828     }
   1829 
   1830     /**
   1831      * Returns a new {@code BigDecimal} whose value is {@code this}, rounded
   1832      * according to the passed context {@code mc}.
   1833      * <p>
   1834      * If {@code mc.precision = 0}, then no rounding is performed.
   1835      * <p>
   1836      * If {@code mc.precision > 0} and {@code mc.roundingMode == UNNECESSARY},
   1837      * then an {@code ArithmeticException} is thrown if the result cannot be
   1838      * represented exactly within the given precision.
   1839      *
   1840      * @param mc
   1841      *            rounding mode and precision for the result of this operation.
   1842      * @return {@code this} rounded according to the passed context.
   1843      * @throws ArithmeticException
   1844      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
   1845      *             UNNECESSARY} and this cannot be represented within the given
   1846      *             precision.
   1847      */
   1848     public BigDecimal round(MathContext mc) {
   1849         BigDecimal thisBD = new BigDecimal(getUnscaledValue(), scale);
   1850 
   1851         thisBD.inplaceRound(mc);
   1852         return thisBD;
   1853     }
   1854 
   1855     /**
   1856      * Returns a new {@code BigDecimal} instance with the specified scale.
   1857      * <p>
   1858      * If the new scale is greater than the old scale, then additional zeros are
   1859      * added to the unscaled value. In this case no rounding is necessary.
   1860      * <p>
   1861      * If the new scale is smaller than the old scale, then trailing digits are
   1862      * removed. If these trailing digits are not zero, then the remaining
   1863      * unscaled value has to be rounded. For this rounding operation the
   1864      * specified rounding mode is used.
   1865      *
   1866      * @param newScale
   1867      *            scale of the result returned.
   1868      * @param roundingMode
   1869      *            rounding mode to be used to round the result.
   1870      * @return a new {@code BigDecimal} instance with the specified scale.
   1871      * @throws NullPointerException
   1872      *             if {@code roundingMode == null}.
   1873      * @throws ArithmeticException
   1874      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
   1875      *             necessary according to the given scale.
   1876      */
   1877     public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
   1878         if (roundingMode == null) {
   1879             throw new NullPointerException("roundingMode == null");
   1880         }
   1881         long diffScale = newScale - (long)scale;
   1882         // Let be:  'this' = [u,s]
   1883         if(diffScale == 0) {
   1884             return this;
   1885         }
   1886         if(diffScale > 0) {
   1887         // return  [u * 10^(s2 - s), newScale]
   1888             if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   1889                     (this.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)diffScale]) < 64 ) {
   1890                 return valueOf(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)diffScale],newScale);
   1891             }
   1892             return new BigDecimal(Multiplication.multiplyByTenPow(getUnscaledValue(),(int)diffScale), newScale);
   1893         }
   1894         // diffScale < 0
   1895         // return  [u,s] / [1,newScale]  with the appropriate scale and rounding
   1896         if(this.bitLength < 64 && -diffScale < MathUtils.LONG_POWERS_OF_TEN.length) {
   1897             return dividePrimitiveLongs(this.smallValue, MathUtils.LONG_POWERS_OF_TEN[(int)-diffScale], newScale,roundingMode);
   1898         }
   1899         return divideBigIntegers(this.getUnscaledValue(),Multiplication.powerOf10(-diffScale),newScale,roundingMode);
   1900     }
   1901 
   1902     /**
   1903      * Returns a new {@code BigDecimal} instance with the specified scale.
   1904      * <p>
   1905      * If the new scale is greater than the old scale, then additional zeros are
   1906      * added to the unscaled value. In this case no rounding is necessary.
   1907      * <p>
   1908      * If the new scale is smaller than the old scale, then trailing digits are
   1909      * removed. If these trailing digits are not zero, then the remaining
   1910      * unscaled value has to be rounded. For this rounding operation the
   1911      * specified rounding mode is used.
   1912      *
   1913      * @param newScale
   1914      *            scale of the result returned.
   1915      * @param roundingMode
   1916      *            rounding mode to be used to round the result.
   1917      * @return a new {@code BigDecimal} instance with the specified scale.
   1918      * @throws IllegalArgumentException
   1919      *             if {@code roundingMode} is not a valid rounding mode.
   1920      * @throws ArithmeticException
   1921      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
   1922      *             necessary according to the given scale.
   1923      */
   1924     public BigDecimal setScale(int newScale, int roundingMode) {
   1925         return setScale(newScale, RoundingMode.valueOf(roundingMode));
   1926     }
   1927 
   1928     /**
   1929      * Returns a new {@code BigDecimal} instance with the specified scale. If
   1930      * the new scale is greater than the old scale, then additional zeros are
   1931      * added to the unscaled value. If the new scale is smaller than the old
   1932      * scale, then trailing zeros are removed. If the trailing digits are not
   1933      * zeros then an ArithmeticException is thrown.
   1934      * <p>
   1935      * If no exception is thrown, then the following equation holds: {@code
   1936      * x.setScale(s).compareTo(x) == 0}.
   1937      *
   1938      * @param newScale
   1939      *            scale of the result returned.
   1940      * @return a new {@code BigDecimal} instance with the specified scale.
   1941      * @throws ArithmeticException
   1942      *             if rounding would be necessary.
   1943      */
   1944     public BigDecimal setScale(int newScale) {
   1945         return setScale(newScale, RoundingMode.UNNECESSARY);
   1946     }
   1947 
   1948     /**
   1949      * Returns a new {@code BigDecimal} instance where the decimal point has
   1950      * been moved {@code n} places to the left. If {@code n < 0} then the
   1951      * decimal point is moved {@code -n} places to the right.
   1952      *
   1953      * <p>The result is obtained by changing its scale. If the scale of the result
   1954      * becomes negative, then its precision is increased such that the scale is
   1955      * zero.
   1956      *
   1957      * <p>Note, that {@code movePointLeft(0)} returns a result which is
   1958      * mathematically equivalent, but which has {@code scale >= 0}.
   1959      */
   1960     public BigDecimal movePointLeft(int n) {
   1961         return movePoint(scale + (long)n);
   1962     }
   1963 
   1964     private BigDecimal movePoint(long newScale) {
   1965         if (isZero()) {
   1966             return zeroScaledBy(Math.max(newScale, 0));
   1967         }
   1968         /*
   1969          * When: 'n'== Integer.MIN_VALUE isn't possible to call to
   1970          * movePointRight(-n) since -Integer.MIN_VALUE == Integer.MIN_VALUE
   1971          */
   1972         if(newScale >= 0) {
   1973             if(bitLength < 64) {
   1974                 return valueOf(smallValue, safeLongToInt(newScale));
   1975             }
   1976             return new BigDecimal(getUnscaledValue(), safeLongToInt(newScale));
   1977         }
   1978         if(-newScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   1979                 bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)-newScale] < 64 ) {
   1980             return valueOf(smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)-newScale],0);
   1981         }
   1982         return new BigDecimal(Multiplication.multiplyByTenPow(
   1983                 getUnscaledValue(), safeLongToInt(-newScale)), 0);
   1984     }
   1985 
   1986     /**
   1987      * Returns a new {@code BigDecimal} instance where the decimal point has
   1988      * been moved {@code n} places to the right. If {@code n < 0} then the
   1989      * decimal point is moved {@code -n} places to the left.
   1990      *
   1991      * <p>The result is obtained by changing its scale. If the scale of the result
   1992      * becomes negative, then its precision is increased such that the scale is
   1993      * zero.
   1994      *
   1995      * <p>Note, that {@code movePointRight(0)} returns a result which is
   1996      * mathematically equivalent, but which has scale >= 0.
   1997      */
   1998     public BigDecimal movePointRight(int n) {
   1999         return movePoint(scale - (long)n);
   2000     }
   2001 
   2002     /**
   2003      * Returns a new {@code BigDecimal} whose value is {@code this * 10<sup>n</sup>}.
   2004      * The scale of the result is {@code this.scale()} - {@code n}.
   2005      * The precision of the result is the precision of {@code this}.
   2006      *
   2007      * <p>This method has the same effect as {@link #movePointRight}, except that
   2008      * the precision is not changed.
   2009      */
   2010     public BigDecimal scaleByPowerOfTen(int n) {
   2011         long newScale = scale - (long)n;
   2012         if(bitLength < 64) {
   2013             //Taking care when a 0 is to be scaled
   2014             if( smallValue==0  ){
   2015                 return zeroScaledBy( newScale );
   2016             }
   2017             return valueOf(smallValue, safeLongToInt(newScale));
   2018         }
   2019         return new BigDecimal(getUnscaledValue(), safeLongToInt(newScale));
   2020     }
   2021 
   2022     /**
   2023      * Returns a new {@code BigDecimal} instance with the same value as {@code
   2024      * this} but with a unscaled value where the trailing zeros have been
   2025      * removed. If the unscaled value of {@code this} has n trailing zeros, then
   2026      * the scale and the precision of the result has been reduced by n.
   2027      *
   2028      * @return a new {@code BigDecimal} instance equivalent to this where the
   2029      *         trailing zeros of the unscaled value have been removed.
   2030      */
   2031     public BigDecimal stripTrailingZeros() {
   2032         int i = 1; // 1 <= i <= 18
   2033         int lastPow = TEN_POW.length - 1;
   2034         long newScale = scale;
   2035 
   2036         if (isZero()) {
   2037             // Preserve RI compatibility, so BigDecimal.equals (which checks
   2038             // value *and* scale) continues to work.
   2039             return this;
   2040         }
   2041         BigInteger strippedBI = getUnscaledValue();
   2042         BigInteger[] quotAndRem;
   2043 
   2044         // while the number is even...
   2045         while (!strippedBI.testBit(0)) {
   2046             // To divide by 10^i
   2047             quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
   2048             // To look the remainder
   2049             if (quotAndRem[1].signum() == 0) {
   2050                 // To adjust the scale
   2051                 newScale -= i;
   2052                 if (i < lastPow) {
   2053                     // To set to the next power
   2054                     i++;
   2055                 }
   2056                 strippedBI = quotAndRem[0];
   2057             } else {
   2058                 if (i == 1) {
   2059                     // 'this' has no more trailing zeros
   2060                     break;
   2061                 }
   2062                 // To set to the smallest power of ten
   2063                 i = 1;
   2064             }
   2065         }
   2066         return new BigDecimal(strippedBI, safeLongToInt(newScale));
   2067     }
   2068 
   2069     /**
   2070      * Compares this {@code BigDecimal} with {@code val}. Returns one of the
   2071      * three values {@code 1}, {@code 0}, or {@code -1}. The method behaves as
   2072      * if {@code this.subtract(val)} is computed. If this difference is > 0 then
   2073      * 1 is returned, if the difference is < 0 then -1 is returned, and if the
   2074      * difference is 0 then 0 is returned. This means, that if two decimal
   2075      * instances are compared which are equal in value but differ in scale, then
   2076      * these two instances are considered as equal.
   2077      *
   2078      * @param val
   2079      *            value to be compared with {@code this}.
   2080      * @return {@code 1} if {@code this > val}, {@code -1} if {@code this < val},
   2081      *         {@code 0} if {@code this == val}.
   2082      * @throws NullPointerException
   2083      *             if {@code val == null}.
   2084      */
   2085     public int compareTo(BigDecimal val) {
   2086         int thisSign = signum();
   2087         int valueSign = val.signum();
   2088 
   2089         if( thisSign == valueSign) {
   2090             if(this.scale == val.scale && this.bitLength<64 && val.bitLength<64 ) {
   2091                 return (smallValue < val.smallValue) ? -1 : (smallValue > val.smallValue) ? 1 : 0;
   2092             }
   2093             long diffScale = (long)this.scale - val.scale;
   2094             int diffPrecision = this.approxPrecision() - val.approxPrecision();
   2095             if (diffPrecision > diffScale + 1) {
   2096                 return thisSign;
   2097             } else if (diffPrecision < diffScale - 1) {
   2098                 return -thisSign;
   2099             } else {// thisSign == val.signum()  and  diffPrecision is aprox. diffScale
   2100                 BigInteger thisUnscaled = this.getUnscaledValue();
   2101                 BigInteger valUnscaled = val.getUnscaledValue();
   2102                 // If any of both precision is bigger, append zeros to the shorter one
   2103                 if (diffScale < 0) {
   2104                     thisUnscaled = thisUnscaled.multiply(Multiplication.powerOf10(-diffScale));
   2105                 } else if (diffScale > 0) {
   2106                     valUnscaled = valUnscaled.multiply(Multiplication.powerOf10(diffScale));
   2107                 }
   2108                 return thisUnscaled.compareTo(valUnscaled);
   2109             }
   2110         } else if (thisSign < valueSign) {
   2111             return -1;
   2112         } else  {
   2113             return 1;
   2114         }
   2115     }
   2116 
   2117     /**
   2118      * Returns {@code true} if {@code x} is a {@code BigDecimal} instance and if
   2119      * this instance is equal to this big decimal. Two big decimals are equal if
   2120      * their unscaled value and their scale is equal. For example, 1.0
   2121      * (10*10<sup>-1</sup>) is not equal to 1.00 (100*10<sup>-2</sup>). Similarly, zero
   2122      * instances are not equal if their scale differs.
   2123      */
   2124     @Override
   2125     public boolean equals(Object x) {
   2126         if (this == x) {
   2127             return true;
   2128         }
   2129         if (x instanceof BigDecimal) {
   2130             BigDecimal x1 = (BigDecimal) x;
   2131             return x1.scale == scale
   2132                     && x1.bitLength == bitLength
   2133                     && (bitLength < 64 ? (x1.smallValue == smallValue) : x1.intVal.equals(intVal));
   2134         }
   2135         return false;
   2136     }
   2137 
   2138     /**
   2139      * Returns the minimum of this {@code BigDecimal} and {@code val}.
   2140      *
   2141      * @param val
   2142      *            value to be used to compute the minimum with this.
   2143      * @return {@code min(this, val}.
   2144      * @throws NullPointerException
   2145      *             if {@code val == null}.
   2146      */
   2147     public BigDecimal min(BigDecimal val) {
   2148         return ((compareTo(val) <= 0) ? this : val);
   2149     }
   2150 
   2151     /**
   2152      * Returns the maximum of this {@code BigDecimal} and {@code val}.
   2153      *
   2154      * @param val
   2155      *            value to be used to compute the maximum with this.
   2156      * @return {@code max(this, val}.
   2157      * @throws NullPointerException
   2158      *             if {@code val == null}.
   2159      */
   2160     public BigDecimal max(BigDecimal val) {
   2161         return ((compareTo(val) >= 0) ? this : val);
   2162     }
   2163 
   2164     /**
   2165      * Returns a hash code for this {@code BigDecimal}.
   2166      *
   2167      * @return hash code for {@code this}.
   2168      */
   2169     @Override
   2170     public int hashCode() {
   2171         if (hashCode != 0) {
   2172             return hashCode;
   2173         }
   2174         if (bitLength < 64) {
   2175             hashCode = (int)(smallValue & 0xffffffff);
   2176             hashCode = 33 * hashCode +  (int)((smallValue >> 32) & 0xffffffff);
   2177             hashCode = 17 * hashCode + scale;
   2178             return hashCode;
   2179         }
   2180         hashCode = 17 * intVal.hashCode() + scale;
   2181         return hashCode;
   2182     }
   2183 
   2184     /**
   2185      * Returns a canonical string representation of this {@code BigDecimal}. If
   2186      * necessary, scientific notation is used. This representation always prints
   2187      * all significant digits of this value.
   2188      * <p>
   2189      * If the scale is negative or if {@code scale - precision >= 6} then
   2190      * scientific notation is used.
   2191      *
   2192      * @return a string representation of {@code this} in scientific notation if
   2193      *         necessary.
   2194      */
   2195     @Override
   2196     public String toString() {
   2197         if (toStringImage != null) {
   2198             return toStringImage;
   2199         }
   2200         if(bitLength < 32) {
   2201             toStringImage = Conversion.toDecimalScaledString(smallValue,scale);
   2202             return toStringImage;
   2203         }
   2204         String intString = getUnscaledValue().toString();
   2205         if (scale == 0) {
   2206             return intString;
   2207         }
   2208         int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
   2209         int end = intString.length();
   2210         long exponent = -(long)scale + end - begin;
   2211         StringBuilder result = new StringBuilder();
   2212 
   2213         result.append(intString);
   2214         if ((scale > 0) && (exponent >= -6)) {
   2215             if (exponent >= 0) {
   2216                 result.insert(end - scale, '.');
   2217             } else {
   2218                 result.insert(begin - 1, "0.");
   2219                 result.insert(begin + 1, CH_ZEROS, 0, -(int)exponent - 1);
   2220             }
   2221         } else {
   2222             if (end - begin >= 1) {
   2223                 result.insert(begin, '.');
   2224                 end++;
   2225             }
   2226             result.insert(end, 'E');
   2227             if (exponent > 0) {
   2228                 result.insert(++end, '+');
   2229             }
   2230             result.insert(++end, Long.toString(exponent));
   2231         }
   2232         toStringImage = result.toString();
   2233         return toStringImage;
   2234     }
   2235 
   2236     /**
   2237      * Returns a string representation of this {@code BigDecimal}. This
   2238      * representation always prints all significant digits of this value.
   2239      * <p>
   2240      * If the scale is negative or if {@code scale - precision >= 6} then
   2241      * engineering notation is used. Engineering notation is similar to the
   2242      * scientific notation except that the exponent is made to be a multiple of
   2243      * 3 such that the integer part is >= 1 and < 1000.
   2244      *
   2245      * @return a string representation of {@code this} in engineering notation
   2246      *         if necessary.
   2247      */
   2248     public String toEngineeringString() {
   2249         String intString = getUnscaledValue().toString();
   2250         if (scale == 0) {
   2251             return intString;
   2252         }
   2253         int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
   2254         int end = intString.length();
   2255         long exponent = -(long)scale + end - begin;
   2256         StringBuilder result = new StringBuilder(intString);
   2257 
   2258         if ((scale > 0) && (exponent >= -6)) {
   2259             if (exponent >= 0) {
   2260                 result.insert(end - scale, '.');
   2261             } else {
   2262                 result.insert(begin - 1, "0.");
   2263                 result.insert(begin + 1, CH_ZEROS, 0, -(int)exponent - 1);
   2264             }
   2265         } else {
   2266             int delta = end - begin;
   2267             int rem = (int)(exponent % 3);
   2268 
   2269             if (rem != 0) {
   2270                 // adjust exponent so it is a multiple of three
   2271                 if (getUnscaledValue().signum() == 0) {
   2272                     // zero value
   2273                     rem = (rem < 0) ? -rem : 3 - rem;
   2274                     exponent += rem;
   2275                 } else {
   2276                     // nonzero value
   2277                     rem = (rem < 0) ? rem + 3 : rem;
   2278                     exponent -= rem;
   2279                     begin += rem;
   2280                 }
   2281                 if (delta < 3) {
   2282                     for (int i = rem - delta; i > 0; i--) {
   2283                         result.insert(end++, '0');
   2284                     }
   2285                 }
   2286             }
   2287             if (end - begin >= 1) {
   2288                 result.insert(begin, '.');
   2289                 end++;
   2290             }
   2291             if (exponent != 0) {
   2292                 result.insert(end, 'E');
   2293                 if (exponent > 0) {
   2294                     result.insert(++end, '+');
   2295                 }
   2296                 result.insert(++end, Long.toString(exponent));
   2297             }
   2298         }
   2299         return result.toString();
   2300     }
   2301 
   2302     /**
   2303      * Returns a string representation of this {@code BigDecimal}. No scientific
   2304      * notation is used. This methods adds zeros where necessary.
   2305      * <p>
   2306      * If this string representation is used to create a new instance, this
   2307      * instance is generally not identical to {@code this} as the precision
   2308      * changes.
   2309      * <p>
   2310      * {@code x.equals(new BigDecimal(x.toPlainString())} usually returns
   2311      * {@code false}.
   2312      * <p>
   2313      * {@code x.compareTo(new BigDecimal(x.toPlainString())} returns {@code 0}.
   2314      *
   2315      * @return a string representation of {@code this} without exponent part.
   2316      */
   2317     public String toPlainString() {
   2318         String intStr = getUnscaledValue().toString();
   2319         if ((scale == 0) || ((isZero()) && (scale < 0))) {
   2320             return intStr;
   2321         }
   2322         int begin = (signum() < 0) ? 1 : 0;
   2323         int delta = scale;
   2324         // We take space for all digits, plus a possible decimal point, plus 'scale'
   2325         StringBuilder result = new StringBuilder(intStr.length() + 1 + Math.abs(scale));
   2326 
   2327         if (begin == 1) {
   2328             // If the number is negative, we insert a '-' character at front
   2329             result.append('-');
   2330         }
   2331         if (scale > 0) {
   2332             delta -= (intStr.length() - begin);
   2333             if (delta >= 0) {
   2334                 result.append("0.");
   2335                 // To append zeros after the decimal point
   2336                 for (; delta > CH_ZEROS.length; delta -= CH_ZEROS.length) {
   2337                     result.append(CH_ZEROS);
   2338                 }
   2339                 result.append(CH_ZEROS, 0, delta);
   2340                 result.append(intStr.substring(begin));
   2341             } else {
   2342                 delta = begin - delta;
   2343                 result.append(intStr.substring(begin, delta));
   2344                 result.append('.');
   2345                 result.append(intStr.substring(delta));
   2346             }
   2347         } else {// (scale <= 0)
   2348             result.append(intStr.substring(begin));
   2349             // To append trailing zeros
   2350             for (; delta < -CH_ZEROS.length; delta += CH_ZEROS.length) {
   2351                 result.append(CH_ZEROS);
   2352             }
   2353             result.append(CH_ZEROS, 0, -delta);
   2354         }
   2355         return result.toString();
   2356     }
   2357 
   2358     /**
   2359      * Returns this {@code BigDecimal} as a big integer instance. A fractional
   2360      * part is discarded.
   2361      *
   2362      * @return this {@code BigDecimal} as a big integer instance.
   2363      */
   2364     public BigInteger toBigInteger() {
   2365         if ((scale == 0) || (isZero())) {
   2366             return getUnscaledValue();
   2367         } else if (scale < 0) {
   2368             return getUnscaledValue().multiply(Multiplication.powerOf10(-(long)scale));
   2369         } else {// (scale > 0)
   2370             return getUnscaledValue().divide(Multiplication.powerOf10(scale));
   2371         }
   2372     }
   2373 
   2374     /**
   2375      * Returns this {@code BigDecimal} as a big integer instance if it has no
   2376      * fractional part. If this {@code BigDecimal} has a fractional part, i.e.
   2377      * if rounding would be necessary, an {@code ArithmeticException} is thrown.
   2378      *
   2379      * @return this {@code BigDecimal} as a big integer value.
   2380      * @throws ArithmeticException
   2381      *             if rounding is necessary.
   2382      */
   2383     public BigInteger toBigIntegerExact() {
   2384         if ((scale == 0) || (isZero())) {
   2385             return getUnscaledValue();
   2386         } else if (scale < 0) {
   2387             return getUnscaledValue().multiply(Multiplication.powerOf10(-(long)scale));
   2388         } else {// (scale > 0)
   2389             BigInteger[] integerAndFraction;
   2390             // An optimization before do a heavy division
   2391             if ((scale > approxPrecision()) || (scale > getUnscaledValue().getLowestSetBit())) {
   2392                 throw new ArithmeticException("Rounding necessary");
   2393             }
   2394             integerAndFraction = getUnscaledValue().divideAndRemainder(Multiplication.powerOf10(scale));
   2395             if (integerAndFraction[1].signum() != 0) {
   2396                 // It exists a non-zero fractional part
   2397                 throw new ArithmeticException("Rounding necessary");
   2398             }
   2399             return integerAndFraction[0];
   2400         }
   2401     }
   2402 
   2403     /**
   2404      * Returns this {@code BigDecimal} as an long value. Any fractional part is
   2405      * discarded. If the integral part of {@code this} is too big to be
   2406      * represented as an long, then {@code this % 2<sup>64</sup>} is returned.
   2407      */
   2408     @Override
   2409     public long longValue() {
   2410         /*
   2411          * If scale <= -64 there are at least 64 trailing bits zero in
   2412          * 10^(-scale). If the scale is positive and very large the long value
   2413          * could be zero.
   2414          */
   2415         return ((scale <= -64) || (scale > approxPrecision()) ? 0L : toBigInteger().longValue());
   2416     }
   2417 
   2418     /**
   2419      * Returns this {@code BigDecimal} as a long value if it has no fractional
   2420      * part and if its value fits to the int range ([-2<sup>63</sup>..2<sup>63</sup>-1]). If
   2421      * these conditions are not met, an {@code ArithmeticException} is thrown.
   2422      *
   2423      * @throws ArithmeticException
   2424      *             if rounding is necessary or the number doesn't fit in a long.
   2425      */
   2426     public long longValueExact() {
   2427         return valueExact(64);
   2428     }
   2429 
   2430     /**
   2431      * Returns this {@code BigDecimal} as an int value. Any fractional part is
   2432      * discarded. If the integral part of {@code this} is too big to be
   2433      * represented as an int, then {@code this % 2<sup>32</sup>} is returned.
   2434      */
   2435     @Override
   2436     public int intValue() {
   2437         /*
   2438          * If scale <= -32 there are at least 32 trailing bits zero in
   2439          * 10^(-scale). If the scale is positive and very large the long value
   2440          * could be zero.
   2441          */
   2442         return ((scale <= -32) || (scale > approxPrecision()) ? 0 : toBigInteger().intValue());
   2443     }
   2444 
   2445     /**
   2446      * Returns this {@code BigDecimal} as a int value if it has no fractional
   2447      * part and if its value fits to the int range ([-2<sup>31</sup>..2<sup>31</sup>-1]). If
   2448      * these conditions are not met, an {@code ArithmeticException} is thrown.
   2449      *
   2450      * @throws ArithmeticException
   2451      *             if rounding is necessary or the number doesn't fit in an int.
   2452      */
   2453     public int intValueExact() {
   2454         return (int) valueExact(32);
   2455     }
   2456 
   2457     /**
   2458      * Returns this {@code BigDecimal} as a short value if it has no fractional
   2459      * part and if its value fits to the short range ([-2<sup>15</sup>..2<sup>15</sup>-1]). If
   2460      * these conditions are not met, an {@code ArithmeticException} is thrown.
   2461      *
   2462      * @throws ArithmeticException
   2463      *             if rounding is necessary of the number doesn't fit in a short.
   2464      */
   2465     public short shortValueExact() {
   2466         return (short) valueExact(16);
   2467     }
   2468 
   2469     /**
   2470      * Returns this {@code BigDecimal} as a byte value if it has no fractional
   2471      * part and if its value fits to the byte range ([-128..127]). If these
   2472      * conditions are not met, an {@code ArithmeticException} is thrown.
   2473      *
   2474      * @throws ArithmeticException
   2475      *             if rounding is necessary or the number doesn't fit in a byte.
   2476      */
   2477     public byte byteValueExact() {
   2478         return (byte) valueExact(8);
   2479     }
   2480 
   2481     /**
   2482      * Returns this {@code BigDecimal} as a float value. If {@code this} is too
   2483      * big to be represented as an float, then {@code Float.POSITIVE_INFINITY}
   2484      * or {@code Float.NEGATIVE_INFINITY} is returned.
   2485      * <p>
   2486      * Note, that if the unscaled value has more than 24 significant digits,
   2487      * then this decimal cannot be represented exactly in a float variable. In
   2488      * this case the result is rounded.
   2489      * <p>
   2490      * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
   2491      * represented exactly as a float, and thus {@code x1.equals(new
   2492      * BigDecimal(x1.floatValue())} returns {@code false} for this case.
   2493      * <p>
   2494      * Similarly, if the instance {@code new BigDecimal(16777217)} is converted
   2495      * to a float, the result is {@code 1.6777216E}7.
   2496      *
   2497      * @return this {@code BigDecimal} as a float value.
   2498      */
   2499     @Override
   2500     public float floatValue() {
   2501         /* A similar code like in doubleValue() could be repeated here,
   2502          * but this simple implementation is quite efficient. */
   2503         float floatResult = signum();
   2504         long powerOfTwo = this.bitLength - (long)(scale / LOG10_2);
   2505         if ((powerOfTwo < -149) || (floatResult == 0.0f)) {
   2506             // Cases which 'this' is very small
   2507             floatResult *= 0.0f;
   2508         } else if (powerOfTwo > 129) {
   2509             // Cases which 'this' is very large
   2510             floatResult *= Float.POSITIVE_INFINITY;
   2511         } else {
   2512             floatResult = (float)doubleValue();
   2513         }
   2514         return floatResult;
   2515     }
   2516 
   2517     /**
   2518      * Returns this {@code BigDecimal} as a double value. If {@code this} is too
   2519      * big to be represented as an float, then {@code Double.POSITIVE_INFINITY}
   2520      * or {@code Double.NEGATIVE_INFINITY} is returned.
   2521      * <p>
   2522      * Note, that if the unscaled value has more than 53 significant digits,
   2523      * then this decimal cannot be represented exactly in a double variable. In
   2524      * this case the result is rounded.
   2525      * <p>
   2526      * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
   2527      * represented exactly as a double, and thus {@code x1.equals(new
   2528      * BigDecimal(x1.doubleValue())} returns {@code false} for this case.
   2529      * <p>
   2530      * Similarly, if the instance {@code new BigDecimal(9007199254740993L)} is
   2531      * converted to a double, the result is {@code 9.007199254740992E15}.
   2532      * <p>
   2533      *
   2534      * @return this {@code BigDecimal} as a double value.
   2535      */
   2536     @Override
   2537     public double doubleValue() {
   2538         int sign = signum();
   2539         int exponent = 1076; // bias + 53
   2540         int lowestSetBit;
   2541         int discardedSize;
   2542         long powerOfTwo = this.bitLength - (long)(scale / LOG10_2);
   2543         long bits; // IEEE-754 Standard
   2544         long tempBits; // for temporal calculations
   2545         BigInteger mantissa;
   2546 
   2547         if ((powerOfTwo < -1074) || (sign == 0)) {
   2548             // Cases which 'this' is very small
   2549             return (sign * 0.0d);
   2550         } else if (powerOfTwo > 1025) {
   2551             // Cases which 'this' is very large
   2552             return (sign * Double.POSITIVE_INFINITY);
   2553         }
   2554         mantissa = getUnscaledValue().abs();
   2555         // Let be:  this = [u,s], with s > 0
   2556         if (scale <= 0) {
   2557             // mantissa = abs(u) * 10^s
   2558             mantissa = mantissa.multiply(Multiplication.powerOf10(-scale));
   2559         } else {// (scale > 0)
   2560             BigInteger quotAndRem[];
   2561             BigInteger powerOfTen = Multiplication.powerOf10(scale);
   2562             int k = 100 - (int)powerOfTwo;
   2563             int compRem;
   2564 
   2565             if (k > 0) {
   2566                 /* Computing (mantissa * 2^k) , where 'k' is a enough big
   2567                  * power of '2' to can divide by 10^s */
   2568                 mantissa = mantissa.shiftLeft(k);
   2569                 exponent -= k;
   2570             }
   2571             // Computing (mantissa * 2^k) / 10^s
   2572             quotAndRem = mantissa.divideAndRemainder(powerOfTen);
   2573             // To check if the fractional part >= 0.5
   2574             compRem = quotAndRem[1].shiftLeftOneBit().compareTo(powerOfTen);
   2575             // To add two rounded bits at end of mantissa
   2576             mantissa = quotAndRem[0].shiftLeft(2).add(
   2577                     BigInteger.valueOf((compRem * (compRem + 3)) / 2 + 1));
   2578             exponent -= 2;
   2579         }
   2580         lowestSetBit = mantissa.getLowestSetBit();
   2581         discardedSize = mantissa.bitLength() - 54;
   2582         if (discardedSize > 0) {// (n > 54)
   2583             // mantissa = (abs(u) * 10^s) >> (n - 54)
   2584             bits = mantissa.shiftRight(discardedSize).longValue();
   2585             tempBits = bits;
   2586             // #bits = 54, to check if the discarded fraction produces a carry
   2587             if ((((bits & 1) == 1) && (lowestSetBit < discardedSize))
   2588                     || ((bits & 3) == 3)) {
   2589                 bits += 2;
   2590             }
   2591         } else {// (n <= 54)
   2592             // mantissa = (abs(u) * 10^s) << (54 - n)
   2593             bits = mantissa.longValue() << -discardedSize;
   2594             tempBits = bits;
   2595             // #bits = 54, to check if the discarded fraction produces a carry:
   2596             if ((bits & 3) == 3) {
   2597                 bits += 2;
   2598             }
   2599         }
   2600         // Testing bit 54 to check if the carry creates a new binary digit
   2601         if ((bits & 0x40000000000000L) == 0) {
   2602             // To drop the last bit of mantissa (first discarded)
   2603             bits >>= 1;
   2604             // exponent = 2^(s-n+53+bias)
   2605             exponent += discardedSize;
   2606         } else {// #bits = 54
   2607             bits >>= 2;
   2608             exponent += discardedSize + 1;
   2609         }
   2610         // To test if the 53-bits number fits in 'double'
   2611         if (exponent > 2046) {// (exponent - bias > 1023)
   2612             return (sign * Double.POSITIVE_INFINITY);
   2613         } else if (exponent <= 0) {// (exponent - bias <= -1023)
   2614             // Denormalized numbers (having exponent == 0)
   2615             if (exponent < -53) {// exponent - bias < -1076
   2616                 return (sign * 0.0d);
   2617             }
   2618             // -1076 <= exponent - bias <= -1023
   2619             // To discard '- exponent + 1' bits
   2620             bits = tempBits >> 1;
   2621             tempBits = bits & (-1L >>> (63 + exponent));
   2622             bits >>= (-exponent );
   2623             // To test if after discard bits, a new carry is generated
   2624             if (((bits & 3) == 3) || (((bits & 1) == 1) && (tempBits != 0)
   2625             && (lowestSetBit < discardedSize))) {
   2626                 bits += 1;
   2627             }
   2628             exponent = 0;
   2629             bits >>= 1;
   2630         }
   2631         // Construct the 64 double bits: [sign(1), exponent(11), mantissa(52)]
   2632         bits = (sign & 0x8000000000000000L) | ((long)exponent << 52)
   2633                 | (bits & 0xFFFFFFFFFFFFFL);
   2634         return Double.longBitsToDouble(bits);
   2635     }
   2636 
   2637     /**
   2638      * Returns the unit in the last place (ULP) of this {@code BigDecimal}
   2639      * instance. An ULP is the distance to the nearest big decimal with the same
   2640      * precision.
   2641      *
   2642      * <p>The amount of a rounding error in the evaluation of a floating-point
   2643      * operation is often expressed in ULPs. An error of 1 ULP is often seen as
   2644      * a tolerable error.
   2645      *
   2646      * <p>For class {@code BigDecimal}, the ULP of a number is simply 10<sup>-scale</sup>.
   2647      * For example, {@code new BigDecimal(0.1).ulp()} returns {@code 1E-55}.
   2648      *
   2649      * @return unit in the last place (ULP) of this {@code BigDecimal} instance.
   2650      */
   2651     public BigDecimal ulp() {
   2652         return valueOf(1, scale);
   2653     }
   2654 
   2655     /* Private Methods */
   2656 
   2657     /**
   2658      * It does all rounding work of the public method
   2659      * {@code round(MathContext)}, performing an inplace rounding
   2660      * without creating a new object.
   2661      *
   2662      * @param mc
   2663      *            the {@code MathContext} for perform the rounding.
   2664      * @see #round(MathContext)
   2665      */
   2666     private void inplaceRound(MathContext mc) {
   2667         int mcPrecision = mc.getPrecision();
   2668         if (approxPrecision() < mcPrecision || mcPrecision == 0) {
   2669             return;
   2670         }
   2671         int discardedPrecision = precision() - mcPrecision;
   2672         // If no rounding is necessary it returns immediately
   2673         if ((discardedPrecision <= 0)) {
   2674             return;
   2675         }
   2676         // When the number is small perform an efficient rounding
   2677         if (this.bitLength < 64) {
   2678             smallRound(mc, discardedPrecision);
   2679             return;
   2680         }
   2681         // Getting the integer part and the discarded fraction
   2682         BigInteger sizeOfFraction = Multiplication.powerOf10(discardedPrecision);
   2683         BigInteger[] integerAndFraction = getUnscaledValue().divideAndRemainder(sizeOfFraction);
   2684         long newScale = (long)scale - discardedPrecision;
   2685         int compRem;
   2686         BigDecimal tempBD;
   2687         // If the discarded fraction is non-zero, perform rounding
   2688         if (integerAndFraction[1].signum() != 0) {
   2689             // To check if the discarded fraction >= 0.5
   2690             compRem = (integerAndFraction[1].abs().shiftLeftOneBit().compareTo(sizeOfFraction));
   2691             // To look if there is a carry
   2692             compRem =  roundingBehavior( integerAndFraction[0].testBit(0) ? 1 : 0,
   2693                     integerAndFraction[1].signum() * (5 + compRem),
   2694                     mc.getRoundingMode());
   2695             if (compRem != 0) {
   2696                 integerAndFraction[0] = integerAndFraction[0].add(BigInteger.valueOf(compRem));
   2697             }
   2698             tempBD = new BigDecimal(integerAndFraction[0]);
   2699             // If after to add the increment the precision changed, we normalize the size
   2700             if (tempBD.precision() > mcPrecision) {
   2701                 integerAndFraction[0] = integerAndFraction[0].divide(BigInteger.TEN);
   2702                 newScale--;
   2703             }
   2704         }
   2705         // To update all internal fields
   2706         scale = safeLongToInt(newScale);
   2707         precision = mcPrecision;
   2708         setUnscaledValue(integerAndFraction[0]);
   2709     }
   2710 
   2711     /**
   2712      * Returns -1, 0, and 1 if {@code value1 < value2}, {@code value1 == value2},
   2713      * and {@code value1 > value2}, respectively, when comparing without regard
   2714      * to the values' sign.
   2715      *
   2716      * <p>Note that this implementation deals correctly with Long.MIN_VALUE,
   2717      * whose absolute magnitude is larger than any other {@code long} value.
   2718      */
   2719     private static int compareAbsoluteValues(long value1, long value2) {
   2720         // Map long values to the range -1 .. Long.MAX_VALUE so that comparison
   2721         // of absolute magnitude can be done using regular long arithmetics.
   2722         // This deals correctly with Long.MIN_VALUE, whose absolute magnitude
   2723         // is larger than any other long value, and which is mapped to
   2724         // Long.MAX_VALUE here.
   2725         // Values that only differ by sign get mapped to the same value, for
   2726         // example both +3 and -3 get mapped to +2.
   2727         value1 = Math.abs(value1) - 1;
   2728         value2 = Math.abs(value2) - 1;
   2729         // Unlike Long.compare(), we guarantee to return specifically -1 and +1
   2730         return value1 > value2 ? 1 : (value1 < value2 ? -1 : 0);
   2731     }
   2732 
   2733     /**
   2734      * Compares {@code n} against {@code 0.5 * d} in absolute terms (ignoring sign)
   2735      * and with arithmetics that are safe against overflow or loss of precision.
   2736      * Returns -1 if {@code n} is less than {@code 0.5 * d}, 0 if {@code n == 0.5 * d},
   2737      * or +1 if {@code n > 0.5 * d} when comparing the absolute values under such
   2738      * arithmetics.
   2739      */
   2740     private static int compareForRounding(long n, long d) {
   2741         long halfD = d / 2; //  rounds towards 0
   2742         if (n == halfD || n == -halfD) {
   2743             // In absolute terms: Because n == halfD, we know that 2 * n + lsb == d
   2744             // for some lsb value 0 or 1. This means that n == d/2 (result 0) if
   2745             // lsb is 0, or n < d/2 (result -1) if lsb is 1. In either case, the
   2746             // result is -lsb.
   2747             // Since we're calculating in absolute terms, we need the absolute lsb
   2748             // (d & 1) as opposed to the signed lsb (d % 2) which would be -1 for
   2749             // negative odd values of d.
   2750             int lsb = (int) d & 1;
   2751             return -lsb; // returns 0 or -1
   2752         } else {
   2753             // In absolute terms, either 2 * n + 1 < d (in the case of n < halfD),
   2754             // or 2 * n > d (in the case of n > halfD).
   2755             // In either case, comparing n against halfD gets the right result
   2756             // -1 or +1, respectively.
   2757             return compareAbsoluteValues(n, halfD);
   2758         }
   2759     }
   2760 
   2761     /**
   2762      * This method implements an efficient rounding for numbers which unscaled
   2763      * value fits in the type {@code long}.
   2764      *
   2765      * @param mc
   2766      *            the context to use
   2767      * @param discardedPrecision
   2768      *            the number of decimal digits that are discarded
   2769      * @see #round(MathContext)
   2770      */
   2771     private void smallRound(MathContext mc, int discardedPrecision) {
   2772         long sizeOfFraction = MathUtils.LONG_POWERS_OF_TEN[discardedPrecision];
   2773         long newScale = (long)scale - discardedPrecision;
   2774         long unscaledVal = smallValue;
   2775         // Getting the integer part and the discarded fraction
   2776         long integer = unscaledVal / sizeOfFraction;
   2777         long fraction = unscaledVal % sizeOfFraction;
   2778         int compRem;
   2779         // If the discarded fraction is non-zero perform rounding
   2780         if (fraction != 0) {
   2781             // To check if the discarded fraction >= 0.5
   2782             compRem = compareForRounding(fraction, sizeOfFraction);
   2783             // To look if there is a carry
   2784             integer += roundingBehavior( ((int)integer) & 1,
   2785                     Long.signum(fraction) * (5 + compRem),
   2786                     mc.getRoundingMode());
   2787             // If after to add the increment the precision changed, we normalize the size
   2788             if (Math.log10(Math.abs(integer)) >= mc.getPrecision()) {
   2789                 integer /= 10;
   2790                 newScale--;
   2791             }
   2792         }
   2793         // To update all internal fields
   2794         scale = safeLongToInt(newScale);
   2795         precision = mc.getPrecision();
   2796         smallValue = integer;
   2797         bitLength = bitLength(integer);
   2798         intVal = null;
   2799     }
   2800 
   2801     /**
   2802      * Return an increment that can be -1,0 or 1, depending of
   2803      * {@code roundingMode}.
   2804      *
   2805      * @param parityBit
   2806      *            can be 0 or 1, it's only used in the case
   2807      *            {@code HALF_EVEN}
   2808      * @param fraction
   2809      *            the mantissa to be analyzed
   2810      * @param roundingMode
   2811      *            the type of rounding
   2812      * @return the carry propagated after rounding
   2813      */
   2814     private static int roundingBehavior(int parityBit, int fraction, RoundingMode roundingMode) {
   2815         int increment = 0; // the carry after rounding
   2816 
   2817         switch (roundingMode) {
   2818             case UNNECESSARY:
   2819                 if (fraction != 0) {
   2820                     throw new ArithmeticException("Rounding necessary");
   2821                 }
   2822                 break;
   2823             case UP:
   2824                 increment = Integer.signum(fraction);
   2825                 break;
   2826             case DOWN:
   2827                 break;
   2828             case CEILING:
   2829                 increment = Math.max(Integer.signum(fraction), 0);
   2830                 break;
   2831             case FLOOR:
   2832                 increment = Math.min(Integer.signum(fraction), 0);
   2833                 break;
   2834             case HALF_UP:
   2835                 if (Math.abs(fraction) >= 5) {
   2836                     increment = Integer.signum(fraction);
   2837                 }
   2838                 break;
   2839             case HALF_DOWN:
   2840                 if (Math.abs(fraction) > 5) {
   2841                     increment = Integer.signum(fraction);
   2842                 }
   2843                 break;
   2844             case HALF_EVEN:
   2845                 if (Math.abs(fraction) + parityBit > 5) {
   2846                     increment = Integer.signum(fraction);
   2847                 }
   2848                 break;
   2849         }
   2850         return increment;
   2851     }
   2852 
   2853     /**
   2854      * If {@code intVal} has a fractional part throws an exception,
   2855      * otherwise it counts the number of bits of value and checks if it's out of
   2856      * the range of the primitive type. If the number fits in the primitive type
   2857      * returns this number as {@code long}, otherwise throws an
   2858      * exception.
   2859      *
   2860      * @param bitLengthOfType
   2861      *            number of bits of the type whose value will be calculated
   2862      *            exactly
   2863      * @return the exact value of the integer part of {@code BigDecimal}
   2864      *         when is possible
   2865      * @throws ArithmeticException when rounding is necessary or the
   2866      *             number don't fit in the primitive type
   2867      */
   2868     private long valueExact(int bitLengthOfType) {
   2869         BigInteger bigInteger = toBigIntegerExact();
   2870 
   2871         if (bigInteger.bitLength() < bitLengthOfType) {
   2872             // It fits in the primitive type
   2873             return bigInteger.longValue();
   2874         }
   2875         throw new ArithmeticException("Rounding necessary");
   2876     }
   2877 
   2878     /**
   2879      * If the precision already was calculated it returns that value, otherwise
   2880      * it calculates a very good approximation efficiently . Note that this
   2881      * value will be {@code precision()} or {@code precision()-1}
   2882      * in the worst case.
   2883      *
   2884      * @return an approximation of {@code precision()} value
   2885      */
   2886     private int approxPrecision() {
   2887         return precision > 0
   2888                 ? precision
   2889                 : (int) ((this.bitLength - 1) * LOG10_2) + 1;
   2890     }
   2891 
   2892     private static int safeLongToInt(long longValue) {
   2893         if (longValue < Integer.MIN_VALUE || longValue > Integer.MAX_VALUE) {
   2894             throw new ArithmeticException("Out of int range: " + longValue);
   2895         }
   2896         return (int) longValue;
   2897     }
   2898 
   2899     /**
   2900      * It returns the value 0 with the most approximated scale of type
   2901      * {@code int}. if {@code longScale > Integer.MAX_VALUE} the
   2902      * scale will be {@code Integer.MAX_VALUE}; if
   2903      * {@code longScale < Integer.MIN_VALUE} the scale will be
   2904      * {@code Integer.MIN_VALUE}; otherwise {@code longScale} is
   2905      * casted to the type {@code int}.
   2906      *
   2907      * @param longScale
   2908      *            the scale to which the value 0 will be scaled.
   2909      * @return the value 0 scaled by the closer scale of type {@code int}.
   2910      * @see #scale
   2911      */
   2912     private static BigDecimal zeroScaledBy(long longScale) {
   2913         if (longScale == (int) longScale) {
   2914             return valueOf(0,(int)longScale);
   2915             }
   2916         if (longScale >= 0) {
   2917             return new BigDecimal( 0, Integer.MAX_VALUE);
   2918         }
   2919         return new BigDecimal( 0, Integer.MIN_VALUE);
   2920     }
   2921 
   2922     /**
   2923      * Assigns all transient fields upon deserialization of a
   2924      * {@code BigDecimal} instance (bitLength and smallValue). The transient
   2925      * field precision is assigned lazily.
   2926      */
   2927     private void readObject(ObjectInputStream in) throws IOException,
   2928             ClassNotFoundException {
   2929         in.defaultReadObject();
   2930 
   2931         this.bitLength = intVal.bitLength();
   2932         if (this.bitLength < 64) {
   2933             this.smallValue = intVal.longValue();
   2934         }
   2935     }
   2936 
   2937     /**
   2938      * Prepares this {@code BigDecimal} for serialization, i.e. the
   2939      * non-transient field {@code intVal} is assigned.
   2940      */
   2941     private void writeObject(ObjectOutputStream out) throws IOException {
   2942         getUnscaledValue();
   2943         out.defaultWriteObject();
   2944     }
   2945 
   2946     private BigInteger getUnscaledValue() {
   2947         if(intVal == null) {
   2948             intVal = BigInteger.valueOf(smallValue);
   2949         }
   2950         return intVal;
   2951     }
   2952 
   2953     private void setUnscaledValue(BigInteger unscaledValue) {
   2954         this.intVal = unscaledValue;
   2955         this.bitLength = unscaledValue.bitLength();
   2956         if(this.bitLength < 64) {
   2957             this.smallValue = unscaledValue.longValue();
   2958         }
   2959     }
   2960 
   2961     private static int bitLength(long smallValue) {
   2962         if(smallValue < 0) {
   2963             smallValue = ~smallValue;
   2964         }
   2965         return 64 - Long.numberOfLeadingZeros(smallValue);
   2966     }
   2967 
   2968     private static int bitLength(int smallValue) {
   2969         if(smallValue < 0) {
   2970             smallValue = ~smallValue;
   2971         }
   2972         return 32 - Integer.numberOfLeadingZeros(smallValue);
   2973     }
   2974 
   2975 }
   2976