• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
Arrays.fill(CH_ZEROS, '0')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 
BigDecimal(long smallValue, int scale)237     private BigDecimal(long smallValue, int scale){
238         this.smallValue = smallValue;
239         this.scale = scale;
240         this.bitLength = bitLength(smallValue);
241     }
242 
BigDecimal(int smallValue, int scale)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      */
BigDecimal(char[] in, int offset, int len)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      */
BigDecimal(char[] in, int offset, int len, MathContext mc)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      */
BigDecimal(char[] in)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      */
BigDecimal(char[] in, MathContext mc)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      */
BigDecimal(String val)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      */
BigDecimal(String val, MathContext mc)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      */
BigDecimal(double val)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      */
BigDecimal(double val, MathContext mc)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      */
BigDecimal(BigInteger val)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      */
BigDecimal(BigInteger val, MathContext mc)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      */
BigDecimal(BigInteger unscaledVal, int scale)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      */
BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)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      */
BigDecimal(int val)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      */
BigDecimal(int val, MathContext mc)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      */
BigDecimal(long val)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      */
BigDecimal(long val, MathContext mc)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      */
valueOf(long unscaledVal, int scale)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      */
valueOf(long unscaledVal)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      */
valueOf(double val)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      */
add(BigDecimal augend)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 
addAndMult10(BigDecimal thisValue,BigDecimal augend, int diffScale)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      */
add(BigDecimal augend, MathContext mc)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      */
subtract(BigDecimal subtrahend)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      */
subtract(BigDecimal subtrahend, MathContext mc)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      */
multiply(BigDecimal multiplicand)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             return valueOf(this.smallValue*multiplicand.smallValue, safeLongToInt(newScale));
942         }
943         return new BigDecimal(this.getUnscaledValue().multiply(
944                 multiplicand.getUnscaledValue()), safeLongToInt(newScale));
945     }
946 
947     /**
948      * Returns a new {@code BigDecimal} whose value is {@code this *
949      * multiplicand}. The result is rounded according to the passed context
950      * {@code mc}.
951      *
952      * @param multiplicand
953      *            value to be multiplied with {@code this}.
954      * @param mc
955      *            rounding mode and precision for the result of this operation.
956      * @return {@code this * multiplicand}.
957      * @throws NullPointerException
958      *             if {@code multiplicand == null} or {@code mc == null}.
959      */
multiply(BigDecimal multiplicand, MathContext mc)960     public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) {
961         BigDecimal result = multiply(multiplicand);
962 
963         result.inplaceRound(mc);
964         return result;
965     }
966 
967     /**
968      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
969      * As scale of the result the parameter {@code scale} is used. If rounding
970      * is required to meet the specified scale, then the specified rounding mode
971      * {@code roundingMode} is applied.
972      *
973      * @param divisor
974      *            value by which {@code this} is divided.
975      * @param scale
976      *            the scale of the result returned.
977      * @param roundingMode
978      *            rounding mode to be used to round the result.
979      * @return {@code this / divisor} rounded according to the given rounding
980      *         mode.
981      * @throws NullPointerException
982      *             if {@code divisor == null}.
983      * @throws IllegalArgumentException
984      *             if {@code roundingMode} is not a valid rounding mode.
985      * @throws ArithmeticException
986      *             if {@code divisor == 0}.
987      * @throws ArithmeticException
988      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
989      *             necessary according to the given scale.
990      */
divide(BigDecimal divisor, int scale, int roundingMode)991     public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
992         return divide(divisor, scale, RoundingMode.valueOf(roundingMode));
993     }
994 
995     /**
996      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
997      * As scale of the result the parameter {@code scale} is used. If rounding
998      * is required to meet the specified scale, then the specified rounding mode
999      * {@code roundingMode} is applied.
1000      *
1001      * @param divisor
1002      *            value by which {@code this} is divided.
1003      * @param scale
1004      *            the scale of the result returned.
1005      * @param roundingMode
1006      *            rounding mode to be used to round the result.
1007      * @return {@code this / divisor} rounded according to the given rounding
1008      *         mode.
1009      * @throws NullPointerException
1010      *             if {@code divisor == null} or {@code roundingMode == null}.
1011      * @throws ArithmeticException
1012      *             if {@code divisor == 0}.
1013      * @throws ArithmeticException
1014      *             if {@code roundingMode == RoundingMode.UNNECESSAR}Y and
1015      *             rounding is necessary according to the given scale and given
1016      *             precision.
1017      */
divide(BigDecimal divisor, int scale, RoundingMode roundingMode)1018     public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
1019         // Let be: this = [u1,s1]  and  divisor = [u2,s2]
1020         if (roundingMode == null) {
1021             throw new NullPointerException("roundingMode == null");
1022         }
1023         if (divisor.isZero()) {
1024             throw new ArithmeticException("Division by zero");
1025         }
1026 
1027         long diffScale = ((long)this.scale - divisor.scale) - scale;
1028         if(this.bitLength < 64 && divisor.bitLength < 64 ) {
1029             if(diffScale == 0) {
1030                 return dividePrimitiveLongs(this.smallValue,
1031                         divisor.smallValue,
1032                         scale,
1033                         roundingMode );
1034             } else if(diffScale > 0) {
1035                 if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
1036                         divisor.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)diffScale] < 64) {
1037                     return dividePrimitiveLongs(this.smallValue,
1038                             divisor.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)diffScale],
1039                             scale,
1040                             roundingMode);
1041                 }
1042             } else { // diffScale < 0
1043                 if(-diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
1044                         this.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)-diffScale] < 64) {
1045                     return dividePrimitiveLongs(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)-diffScale],
1046                             divisor.smallValue,
1047                             scale,
1048                             roundingMode);
1049                 }
1050 
1051             }
1052         }
1053         BigInteger scaledDividend = this.getUnscaledValue();
1054         BigInteger scaledDivisor = divisor.getUnscaledValue(); // for scaling of 'u2'
1055 
1056         if (diffScale > 0) {
1057             // Multiply 'u2'  by:  10^((s1 - s2) - scale)
1058             scaledDivisor = Multiplication.multiplyByTenPow(scaledDivisor, (int)diffScale);
1059         } else if (diffScale < 0) {
1060             // Multiply 'u1'  by:  10^(scale - (s1 - s2))
1061             scaledDividend  = Multiplication.multiplyByTenPow(scaledDividend, (int)-diffScale);
1062         }
1063         return divideBigIntegers(scaledDividend, scaledDivisor, scale, roundingMode);
1064         }
1065 
divideBigIntegers(BigInteger scaledDividend, BigInteger scaledDivisor, int scale, RoundingMode roundingMode)1066     private static BigDecimal divideBigIntegers(BigInteger scaledDividend, BigInteger scaledDivisor, int scale, RoundingMode roundingMode) {
1067 
1068         BigInteger[] quotAndRem = scaledDividend.divideAndRemainder(scaledDivisor);  // quotient and remainder
1069         // If after division there is a remainder...
1070         BigInteger quotient = quotAndRem[0];
1071         BigInteger remainder = quotAndRem[1];
1072         if (remainder.signum() == 0) {
1073             return new BigDecimal(quotient, scale);
1074         }
1075         int sign = scaledDividend.signum() * scaledDivisor.signum();
1076         int compRem;                                      // 'compare to remainder'
1077         if(scaledDivisor.bitLength() < 63) { // 63 in order to avoid out of long after *2
1078             long rem = remainder.longValue();
1079             long divisor = scaledDivisor.longValue();
1080             compRem = longCompareTo(Math.abs(rem) * 2,Math.abs(divisor));
1081             // To look if there is a carry
1082             compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0,
1083                     sign * (5 + compRem), roundingMode);
1084 
1085         } else {
1086             // Checking if:  remainder * 2 >= scaledDivisor
1087             compRem = remainder.abs().shiftLeftOneBit().compareTo(scaledDivisor.abs());
1088             compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0,
1089                     sign * (5 + compRem), roundingMode);
1090         }
1091             if (compRem != 0) {
1092             if(quotient.bitLength() < 63) {
1093                 return valueOf(quotient.longValue() + compRem,scale);
1094             }
1095             quotient = quotient.add(BigInteger.valueOf(compRem));
1096             return new BigDecimal(quotient, scale);
1097         }
1098         // Constructing the result with the appropriate unscaled value
1099         return new BigDecimal(quotient, scale);
1100     }
1101 
dividePrimitiveLongs(long scaledDividend, long scaledDivisor, int scale, RoundingMode roundingMode)1102     private static BigDecimal dividePrimitiveLongs(long scaledDividend, long scaledDivisor, int scale, RoundingMode roundingMode) {
1103         long quotient = scaledDividend / scaledDivisor;
1104         long remainder = scaledDividend % scaledDivisor;
1105         int sign = Long.signum( scaledDividend ) * Long.signum( scaledDivisor );
1106         if (remainder != 0) {
1107             // Checking if:  remainder * 2 >= scaledDivisor
1108             int compRem;                                      // 'compare to remainder'
1109             compRem = longCompareTo(Math.abs(remainder) * 2,Math.abs(scaledDivisor));
1110             // To look if there is a carry
1111             quotient += roundingBehavior(((int)quotient) & 1,
1112                     sign * (5 + compRem),
1113                     roundingMode);
1114         }
1115         // Constructing the result with the appropriate unscaled value
1116         return valueOf(quotient, scale);
1117     }
1118 
1119     /**
1120      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
1121      * The scale of the result is the scale of {@code this}. If rounding is
1122      * required to meet the specified scale, then the specified rounding mode
1123      * {@code roundingMode} is applied.
1124      *
1125      * @param divisor
1126      *            value by which {@code this} is divided.
1127      * @param roundingMode
1128      *            rounding mode to be used to round the result.
1129      * @return {@code this / divisor} rounded according to the given rounding
1130      *         mode.
1131      * @throws NullPointerException
1132      *             if {@code divisor == null}.
1133      * @throws IllegalArgumentException
1134      *             if {@code roundingMode} is not a valid rounding mode.
1135      * @throws ArithmeticException
1136      *             if {@code divisor == 0}.
1137      * @throws ArithmeticException
1138      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
1139      *             necessary according to the scale of this.
1140      */
divide(BigDecimal divisor, int roundingMode)1141     public BigDecimal divide(BigDecimal divisor, int roundingMode) {
1142         return divide(divisor, scale, RoundingMode.valueOf(roundingMode));
1143     }
1144 
1145     /**
1146      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
1147      * The scale of the result is the scale of {@code this}. If rounding is
1148      * required to meet the specified scale, then the specified rounding mode
1149      * {@code roundingMode} is applied.
1150      *
1151      * @param divisor
1152      *            value by which {@code this} is divided.
1153      * @param roundingMode
1154      *            rounding mode to be used to round the result.
1155      * @return {@code this / divisor} rounded according to the given rounding
1156      *         mode.
1157      * @throws NullPointerException
1158      *             if {@code divisor == null} or {@code roundingMode == null}.
1159      * @throws ArithmeticException
1160      *             if {@code divisor == 0}.
1161      * @throws ArithmeticException
1162      *             if {@code roundingMode == RoundingMode.UNNECESSARY} and
1163      *             rounding is necessary according to the scale of this.
1164      */
divide(BigDecimal divisor, RoundingMode roundingMode)1165     public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) {
1166         return divide(divisor, scale, roundingMode);
1167     }
1168 
1169     /**
1170      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
1171      * The scale of the result is the difference of the scales of {@code this}
1172      * and {@code divisor}. If the exact result requires more digits, then the
1173      * scale is adjusted accordingly. For example, {@code 1/128 = 0.0078125}
1174      * which has a scale of {@code 7} and precision {@code 5}.
1175      *
1176      * @param divisor
1177      *            value by which {@code this} is divided.
1178      * @return {@code this / divisor}.
1179      * @throws NullPointerException
1180      *             if {@code divisor == null}.
1181      * @throws ArithmeticException
1182      *             if {@code divisor == 0}.
1183      * @throws ArithmeticException
1184      *             if the result cannot be represented exactly.
1185      */
divide(BigDecimal divisor)1186     public BigDecimal divide(BigDecimal divisor) {
1187         BigInteger p = this.getUnscaledValue();
1188         BigInteger q = divisor.getUnscaledValue();
1189         BigInteger gcd; // greatest common divisor between 'p' and 'q'
1190         BigInteger quotAndRem[];
1191         long diffScale = (long)scale - divisor.scale;
1192         int newScale; // the new scale for final quotient
1193         int k; // number of factors "2" in 'q'
1194         int l = 0; // number of factors "5" in 'q'
1195         int i = 1;
1196         int lastPow = FIVE_POW.length - 1;
1197 
1198         if (divisor.isZero()) {
1199             throw new ArithmeticException("Division by zero");
1200         }
1201         if (p.signum() == 0) {
1202             return zeroScaledBy(diffScale);
1203         }
1204         // To divide both by the GCD
1205         gcd = p.gcd(q);
1206         p = p.divide(gcd);
1207         q = q.divide(gcd);
1208         // To simplify all "2" factors of q, dividing by 2^k
1209         k = q.getLowestSetBit();
1210         q = q.shiftRight(k);
1211         // To simplify all "5" factors of q, dividing by 5^l
1212         do {
1213             quotAndRem = q.divideAndRemainder(FIVE_POW[i]);
1214             if (quotAndRem[1].signum() == 0) {
1215                 l += i;
1216                 if (i < lastPow) {
1217                     i++;
1218                 }
1219                 q = quotAndRem[0];
1220             } else {
1221                 if (i == 1) {
1222                     break;
1223                 }
1224                 i = 1;
1225             }
1226         } while (true);
1227         // If  abs(q) != 1  then the quotient is periodic
1228         if (!q.abs().equals(BigInteger.ONE)) {
1229             throw new ArithmeticException("Non-terminating decimal expansion; no exact representable decimal result");
1230         }
1231         // The sign of the is fixed and the quotient will be saved in 'p'
1232         if (q.signum() < 0) {
1233             p = p.negate();
1234         }
1235         // Checking if the new scale is out of range
1236         newScale = safeLongToInt(diffScale + Math.max(k, l));
1237         // k >= 0  and  l >= 0  implies that  k - l  is in the 32-bit range
1238         i = k - l;
1239 
1240         p = (i > 0) ? Multiplication.multiplyByFivePow(p, i)
1241         : p.shiftLeft(-i);
1242         return new BigDecimal(p, newScale);
1243     }
1244 
1245     /**
1246      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
1247      * The result is rounded according to the passed context {@code mc}. If the
1248      * passed math context specifies precision {@code 0}, then this call is
1249      * equivalent to {@code this.divide(divisor)}.
1250      *
1251      * @param divisor
1252      *            value by which {@code this} is divided.
1253      * @param mc
1254      *            rounding mode and precision for the result of this operation.
1255      * @return {@code this / divisor}.
1256      * @throws NullPointerException
1257      *             if {@code divisor == null} or {@code mc == null}.
1258      * @throws ArithmeticException
1259      *             if {@code divisor == 0}.
1260      * @throws ArithmeticException
1261      *             if {@code mc.getRoundingMode() == UNNECESSARY} and rounding
1262      *             is necessary according {@code mc.getPrecision()}.
1263      */
divide(BigDecimal divisor, MathContext mc)1264     public BigDecimal divide(BigDecimal divisor, MathContext mc) {
1265         /* Calculating how many zeros must be append to 'dividend'
1266          * to obtain a  quotient with at least 'mc.precision()' digits */
1267         long trailingZeros = mc.getPrecision() + 2L
1268                 + divisor.approxPrecision() - approxPrecision();
1269         long diffScale = (long)scale - divisor.scale;
1270         long newScale = diffScale; // scale of the final quotient
1271         int compRem; // to compare the remainder
1272         int i = 1; // index
1273         int lastPow = TEN_POW.length - 1; // last power of ten
1274         BigInteger integerQuot; // for temporal results
1275         BigInteger quotAndRem[] = {getUnscaledValue()};
1276         // In special cases it reduces the problem to call the dual method
1277         if ((mc.getPrecision() == 0) || (this.isZero())
1278         || (divisor.isZero())) {
1279             return this.divide(divisor);
1280         }
1281         if (trailingZeros > 0) {
1282             // To append trailing zeros at end of dividend
1283             quotAndRem[0] = getUnscaledValue().multiply( Multiplication.powerOf10(trailingZeros) );
1284             newScale += trailingZeros;
1285         }
1286         quotAndRem = quotAndRem[0].divideAndRemainder( divisor.getUnscaledValue() );
1287         integerQuot = quotAndRem[0];
1288         // Calculating the exact quotient with at least 'mc.precision()' digits
1289         if (quotAndRem[1].signum() != 0) {
1290             // Checking if:   2 * remainder >= divisor ?
1291             compRem = quotAndRem[1].shiftLeftOneBit().compareTo( divisor.getUnscaledValue() );
1292             // quot := quot * 10 + r;     with 'r' in {-6,-5,-4, 0,+4,+5,+6}
1293             integerQuot = integerQuot.multiply(BigInteger.TEN)
1294             .add(BigInteger.valueOf(quotAndRem[0].signum() * (5 + compRem)));
1295             newScale++;
1296         } else {
1297             // To strip trailing zeros until the preferred scale is reached
1298             while (!integerQuot.testBit(0)) {
1299                 quotAndRem = integerQuot.divideAndRemainder(TEN_POW[i]);
1300                 if ((quotAndRem[1].signum() == 0)
1301                         && (newScale - i >= diffScale)) {
1302                     newScale -= i;
1303                     if (i < lastPow) {
1304                         i++;
1305                     }
1306                     integerQuot = quotAndRem[0];
1307                 } else {
1308                     if (i == 1) {
1309                         break;
1310                     }
1311                     i = 1;
1312                 }
1313             }
1314         }
1315         // To perform rounding
1316         return new BigDecimal(integerQuot, safeLongToInt(newScale), mc);
1317     }
1318 
1319     /**
1320      * Returns a new {@code BigDecimal} whose value is the integral part of
1321      * {@code this / divisor}. The quotient is rounded down towards zero to the
1322      * next integer. For example, {@code 0.5/0.2 = 2}.
1323      *
1324      * @param divisor
1325      *            value by which {@code this} is divided.
1326      * @return integral part of {@code this / divisor}.
1327      * @throws NullPointerException
1328      *             if {@code divisor == null}.
1329      * @throws ArithmeticException
1330      *             if {@code divisor == 0}.
1331      */
divideToIntegralValue(BigDecimal divisor)1332     public BigDecimal divideToIntegralValue(BigDecimal divisor) {
1333         BigInteger integralValue; // the integer of result
1334         BigInteger powerOfTen; // some power of ten
1335         BigInteger quotAndRem[] = {getUnscaledValue()};
1336         long newScale = (long)this.scale - divisor.scale;
1337         long tempScale = 0;
1338         int i = 1;
1339         int lastPow = TEN_POW.length - 1;
1340 
1341         if (divisor.isZero()) {
1342             throw new ArithmeticException("Division by zero");
1343         }
1344         if ((divisor.approxPrecision() + newScale > this.approxPrecision() + 1L)
1345         || (this.isZero())) {
1346             /* If the divisor's integer part is greater than this's integer part,
1347              * the result must be zero with the appropriate scale */
1348             integralValue = BigInteger.ZERO;
1349         } else if (newScale == 0) {
1350             integralValue = getUnscaledValue().divide( divisor.getUnscaledValue() );
1351         } else if (newScale > 0) {
1352             powerOfTen = Multiplication.powerOf10(newScale);
1353             integralValue = getUnscaledValue().divide( divisor.getUnscaledValue().multiply(powerOfTen) );
1354             integralValue = integralValue.multiply(powerOfTen);
1355         } else {// (newScale < 0)
1356             powerOfTen = Multiplication.powerOf10(-newScale);
1357             integralValue = getUnscaledValue().multiply(powerOfTen).divide( divisor.getUnscaledValue() );
1358             // To strip trailing zeros approximating to the preferred scale
1359             while (!integralValue.testBit(0)) {
1360                 quotAndRem = integralValue.divideAndRemainder(TEN_POW[i]);
1361                 if ((quotAndRem[1].signum() == 0)
1362                         && (tempScale - i >= newScale)) {
1363                     tempScale -= i;
1364                     if (i < lastPow) {
1365                         i++;
1366                     }
1367                     integralValue = quotAndRem[0];
1368                 } else {
1369                     if (i == 1) {
1370                         break;
1371                     }
1372                     i = 1;
1373                 }
1374             }
1375             newScale = tempScale;
1376         }
1377         return ((integralValue.signum() == 0)
1378         ? zeroScaledBy(newScale)
1379                 : new BigDecimal(integralValue, safeLongToInt(newScale)));
1380     }
1381 
1382     /**
1383      * Returns a new {@code BigDecimal} whose value is the integral part of
1384      * {@code this / divisor}. The quotient is rounded down towards zero to the
1385      * next integer. The rounding mode passed with the parameter {@code mc} is
1386      * not considered. But if the precision of {@code mc > 0} and the integral
1387      * part requires more digits, then an {@code ArithmeticException} is thrown.
1388      *
1389      * @param divisor
1390      *            value by which {@code this} is divided.
1391      * @param mc
1392      *            math context which determines the maximal precision of the
1393      *            result.
1394      * @return integral part of {@code this / divisor}.
1395      * @throws NullPointerException
1396      *             if {@code divisor == null} or {@code mc == null}.
1397      * @throws ArithmeticException
1398      *             if {@code divisor == 0}.
1399      * @throws ArithmeticException
1400      *             if {@code mc.getPrecision() > 0} and the result requires more
1401      *             digits to be represented.
1402      */
divideToIntegralValue(BigDecimal divisor, MathContext mc)1403     public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) {
1404         int mcPrecision = mc.getPrecision();
1405         int diffPrecision = this.precision() - divisor.precision();
1406         int lastPow = TEN_POW.length - 1;
1407         long diffScale = (long)this.scale - divisor.scale;
1408         long newScale = diffScale;
1409         long quotPrecision = diffPrecision - diffScale + 1;
1410         BigInteger quotAndRem[] = new BigInteger[2];
1411         // In special cases it call the dual method
1412         if ((mcPrecision == 0) || (this.isZero()) || (divisor.isZero())) {
1413             return this.divideToIntegralValue(divisor);
1414         }
1415         // Let be:   this = [u1,s1]   and   divisor = [u2,s2]
1416         if (quotPrecision <= 0) {
1417             quotAndRem[0] = BigInteger.ZERO;
1418         } else if (diffScale == 0) {
1419             // CASE s1 == s2:  to calculate   u1 / u2
1420             quotAndRem[0] = this.getUnscaledValue().divide( divisor.getUnscaledValue() );
1421         } else if (diffScale > 0) {
1422             // CASE s1 >= s2:  to calculate   u1 / (u2 * 10^(s1-s2)
1423             quotAndRem[0] = this.getUnscaledValue().divide(
1424                     divisor.getUnscaledValue().multiply(Multiplication.powerOf10(diffScale)) );
1425             // To chose  10^newScale  to get a quotient with at least 'mc.precision()' digits
1426             newScale = Math.min(diffScale, Math.max(mcPrecision - quotPrecision + 1, 0));
1427             // To calculate: (u1 / (u2 * 10^(s1-s2)) * 10^newScale
1428             quotAndRem[0] = quotAndRem[0].multiply(Multiplication.powerOf10(newScale));
1429         } else {// CASE s2 > s1:
1430             /* To calculate the minimum power of ten, such that the quotient
1431              *   (u1 * 10^exp) / u2   has at least 'mc.precision()' digits. */
1432             long exp = Math.min(-diffScale, Math.max((long)mcPrecision - diffPrecision, 0));
1433             long compRemDiv;
1434             // Let be:   (u1 * 10^exp) / u2 = [q,r]
1435             quotAndRem = this.getUnscaledValue().multiply(Multiplication.powerOf10(exp)).
1436                     divideAndRemainder(divisor.getUnscaledValue());
1437             newScale += exp; // To fix the scale
1438             exp = -newScale; // The remaining power of ten
1439             // If after division there is a remainder...
1440             if ((quotAndRem[1].signum() != 0) && (exp > 0)) {
1441                 // Log10(r) + ((s2 - s1) - exp) > mc.precision ?
1442                 compRemDiv = (new BigDecimal(quotAndRem[1])).precision()
1443                 + exp - divisor.precision();
1444                 if (compRemDiv == 0) {
1445                     // To calculate:  (r * 10^exp2) / u2
1446                     quotAndRem[1] = quotAndRem[1].multiply(Multiplication.powerOf10(exp)).
1447                             divide(divisor.getUnscaledValue());
1448                     compRemDiv = Math.abs(quotAndRem[1].signum());
1449                 }
1450                 if (compRemDiv > 0) {
1451                     throw new ArithmeticException("Division impossible");
1452                 }
1453             }
1454         }
1455         // Fast return if the quotient is zero
1456         if (quotAndRem[0].signum() == 0) {
1457             return zeroScaledBy(diffScale);
1458         }
1459         BigInteger strippedBI = quotAndRem[0];
1460         BigDecimal integralValue = new BigDecimal(quotAndRem[0]);
1461         long resultPrecision = integralValue.precision();
1462         int i = 1;
1463         // To strip trailing zeros until the specified precision is reached
1464         while (!strippedBI.testBit(0)) {
1465             quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
1466             if ((quotAndRem[1].signum() == 0) &&
1467                     ((resultPrecision - i >= mcPrecision)
1468                     || (newScale - i >= diffScale)) ) {
1469                 resultPrecision -= i;
1470                 newScale -= i;
1471                 if (i < lastPow) {
1472                     i++;
1473                 }
1474                 strippedBI = quotAndRem[0];
1475             } else {
1476                 if (i == 1) {
1477                     break;
1478                 }
1479                 i = 1;
1480             }
1481         }
1482         // To check if the result fit in 'mc.precision()' digits
1483         if (resultPrecision > mcPrecision) {
1484             throw new ArithmeticException("Division impossible");
1485         }
1486         integralValue.scale = safeLongToInt(newScale);
1487         integralValue.setUnscaledValue(strippedBI);
1488         return integralValue;
1489     }
1490 
1491     /**
1492      * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
1493      * <p>
1494      * The remainder is defined as {@code this -
1495      * this.divideToIntegralValue(divisor) * divisor}.
1496      *
1497      * @param divisor
1498      *            value by which {@code this} is divided.
1499      * @return {@code this % divisor}.
1500      * @throws NullPointerException
1501      *             if {@code divisor == null}.
1502      * @throws ArithmeticException
1503      *             if {@code divisor == 0}.
1504      */
remainder(BigDecimal divisor)1505     public BigDecimal remainder(BigDecimal divisor) {
1506         return divideAndRemainder(divisor)[1];
1507     }
1508 
1509     /**
1510      * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
1511      * <p>
1512      * The remainder is defined as {@code this -
1513      * this.divideToIntegralValue(divisor) * divisor}.
1514      * <p>
1515      * The specified rounding mode {@code mc} is used for the division only.
1516      *
1517      * @param divisor
1518      *            value by which {@code this} is divided.
1519      * @param mc
1520      *            rounding mode and precision to be used.
1521      * @return {@code this % divisor}.
1522      * @throws NullPointerException
1523      *             if {@code divisor == null}.
1524      * @throws ArithmeticException
1525      *             if {@code divisor == 0}.
1526      * @throws ArithmeticException
1527      *             if {@code mc.getPrecision() > 0} and the result of {@code
1528      *             this.divideToIntegralValue(divisor, mc)} requires more digits
1529      *             to be represented.
1530      */
remainder(BigDecimal divisor, MathContext mc)1531     public BigDecimal remainder(BigDecimal divisor, MathContext mc) {
1532         return divideAndRemainder(divisor, mc)[1];
1533     }
1534 
1535     /**
1536      * Returns a {@code BigDecimal} array which contains the integral part of
1537      * {@code this / divisor} at index 0 and the remainder {@code this %
1538      * divisor} at index 1. The quotient is rounded down towards zero to the
1539      * next integer.
1540      *
1541      * @param divisor
1542      *            value by which {@code this} is divided.
1543      * @return {@code [this.divideToIntegralValue(divisor),
1544      *         this.remainder(divisor)]}.
1545      * @throws NullPointerException
1546      *             if {@code divisor == null}.
1547      * @throws ArithmeticException
1548      *             if {@code divisor == 0}.
1549      * @see #divideToIntegralValue
1550      * @see #remainder
1551      */
divideAndRemainder(BigDecimal divisor)1552     public BigDecimal[] divideAndRemainder(BigDecimal divisor) {
1553         BigDecimal quotAndRem[] = new BigDecimal[2];
1554 
1555         quotAndRem[0] = this.divideToIntegralValue(divisor);
1556         quotAndRem[1] = this.subtract( quotAndRem[0].multiply(divisor) );
1557         return quotAndRem;
1558     }
1559 
1560     /**
1561      * Returns a {@code BigDecimal} array which contains the integral part of
1562      * {@code this / divisor} at index 0 and the remainder {@code this %
1563      * divisor} at index 1. The quotient is rounded down towards zero to the
1564      * next integer. The rounding mode passed with the parameter {@code mc} is
1565      * not considered. But if the precision of {@code mc > 0} and the integral
1566      * part requires more digits, then an {@code ArithmeticException} is thrown.
1567      *
1568      * @param divisor
1569      *            value by which {@code this} is divided.
1570      * @param mc
1571      *            math context which determines the maximal precision of the
1572      *            result.
1573      * @return {@code [this.divideToIntegralValue(divisor),
1574      *         this.remainder(divisor)]}.
1575      * @throws NullPointerException
1576      *             if {@code divisor == null}.
1577      * @throws ArithmeticException
1578      *             if {@code divisor == 0}.
1579      * @see #divideToIntegralValue
1580      * @see #remainder
1581      */
divideAndRemainder(BigDecimal divisor, MathContext mc)1582     public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) {
1583         BigDecimal quotAndRem[] = new BigDecimal[2];
1584 
1585         quotAndRem[0] = this.divideToIntegralValue(divisor, mc);
1586         quotAndRem[1] = this.subtract( quotAndRem[0].multiply(divisor) );
1587         return quotAndRem;
1588     }
1589 
1590     /**
1591      * Returns a new {@code BigDecimal} whose value is {@code this<sup>n</sup>}. The
1592      * scale of the result is {@code n * this.scale()}.
1593      *
1594      * <p>{@code x.pow(0)} returns {@code 1}, even if {@code x == 0}.
1595      *
1596      * <p>Implementation Note: The implementation is based on the ANSI standard
1597      * X3.274-1996 algorithm.
1598      *
1599      * @throws ArithmeticException
1600      *             if {@code n < 0} or {@code n > 999999999}.
1601      */
pow(int n)1602     public BigDecimal pow(int n) {
1603         if (n == 0) {
1604             return ONE;
1605         }
1606         if ((n < 0) || (n > 999999999)) {
1607             throw new ArithmeticException("Invalid operation");
1608         }
1609         long newScale = scale * (long)n;
1610         // Let be: this = [u,s]   so:  this^n = [u^n, s*n]
1611         return isZero() ? zeroScaledBy(newScale)
1612                 : new BigDecimal(getUnscaledValue().pow(n), safeLongToInt(newScale));
1613     }
1614 
1615     /**
1616      * Returns a new {@code BigDecimal} whose value is {@code this<sup>n</sup>}. The
1617      * result is rounded according to the passed context {@code mc}.
1618      *
1619      * <p>Implementation Note: The implementation is based on the ANSI standard
1620      * X3.274-1996 algorithm.
1621      *
1622      * @param mc
1623      *            rounding mode and precision for the result of this operation.
1624      * @throws ArithmeticException
1625      *             if {@code n < 0} or {@code n > 999999999}.
1626      */
pow(int n, MathContext mc)1627     public BigDecimal pow(int n, MathContext mc) {
1628         // The ANSI standard X3.274-1996 algorithm
1629         int m = Math.abs(n);
1630         int mcPrecision = mc.getPrecision();
1631         int elength = (int)Math.log10(m) + 1;   // decimal digits in 'n'
1632         int oneBitMask; // mask of bits
1633         BigDecimal accum; // the single accumulator
1634         MathContext newPrecision = mc; // MathContext by default
1635 
1636         // In particular cases, it reduces the problem to call the other 'pow()'
1637         if ((n == 0) || ((isZero()) && (n > 0))) {
1638             return pow(n);
1639         }
1640         if ((m > 999999999) || ((mcPrecision == 0) && (n < 0))
1641                 || ((mcPrecision > 0) && (elength > mcPrecision))) {
1642             throw new ArithmeticException("Invalid operation");
1643         }
1644         if (mcPrecision > 0) {
1645             newPrecision = new MathContext( mcPrecision + elength + 1,
1646                     mc.getRoundingMode());
1647         }
1648         // The result is calculated as if 'n' were positive
1649         accum = round(newPrecision);
1650         oneBitMask = Integer.highestOneBit(m) >> 1;
1651 
1652         while (oneBitMask > 0) {
1653             accum = accum.multiply(accum, newPrecision);
1654             if ((m & oneBitMask) == oneBitMask) {
1655                 accum = accum.multiply(this, newPrecision);
1656             }
1657             oneBitMask >>= 1;
1658         }
1659         // If 'n' is negative, the value is divided into 'ONE'
1660         if (n < 0) {
1661             accum = ONE.divide(accum, newPrecision);
1662         }
1663         // The final value is rounded to the destination precision
1664         accum.inplaceRound(mc);
1665         return accum;
1666     }
1667 
1668     /**
1669      * Returns a {@code BigDecimal} whose value is the absolute value of
1670      * {@code this}. The scale of the result is the same as the scale of this.
1671      */
abs()1672     public BigDecimal abs() {
1673         return ((signum() < 0) ? negate() : this);
1674     }
1675 
1676     /**
1677      * Returns a {@code BigDecimal} whose value is the absolute value of
1678      * {@code this}. The result is rounded according to the passed context
1679      * {@code mc}.
1680      */
abs(MathContext mc)1681     public BigDecimal abs(MathContext mc) {
1682         BigDecimal result = (signum() < 0) ? negate() : new BigDecimal(getUnscaledValue(), scale);
1683         result.inplaceRound(mc);
1684         return result;
1685     }
1686 
1687     /**
1688      * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
1689      * scale of the result is the same as the scale of this.
1690      *
1691      * @return {@code -this}
1692      */
negate()1693     public BigDecimal negate() {
1694         if(bitLength < 63 || (bitLength == 63 && smallValue!=Long.MIN_VALUE)) {
1695             return valueOf(-smallValue,scale);
1696         }
1697         return new BigDecimal(getUnscaledValue().negate(), scale);
1698     }
1699 
1700     /**
1701      * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
1702      * result is rounded according to the passed context {@code mc}.
1703      *
1704      * @param mc
1705      *            rounding mode and precision for the result of this operation.
1706      * @return {@code -this}
1707      */
negate(MathContext mc)1708     public BigDecimal negate(MathContext mc) {
1709         BigDecimal result = negate();
1710         result.inplaceRound(mc);
1711         return result;
1712     }
1713 
1714     /**
1715      * Returns a new {@code BigDecimal} whose value is {@code +this}. The scale
1716      * of the result is the same as the scale of this.
1717      *
1718      * @return {@code this}
1719      */
plus()1720     public BigDecimal plus() {
1721         return this;
1722     }
1723 
1724     /**
1725      * Returns a new {@code BigDecimal} whose value is {@code +this}. The result
1726      * is rounded according to the passed context {@code mc}.
1727      *
1728      * @param mc
1729      *            rounding mode and precision for the result of this operation.
1730      * @return {@code this}, rounded
1731      */
plus(MathContext mc)1732     public BigDecimal plus(MathContext mc) {
1733         return round(mc);
1734     }
1735 
1736     /**
1737      * Returns the sign of this {@code BigDecimal}.
1738      *
1739      * @return {@code -1} if {@code this < 0},
1740      *         {@code 0} if {@code this == 0},
1741      *         {@code 1} if {@code this > 0}.
1742      */
signum()1743     public int signum() {
1744         if( bitLength < 64) {
1745             return Long.signum( this.smallValue );
1746         }
1747         return getUnscaledValue().signum();
1748     }
1749 
isZero()1750     private boolean isZero() {
1751         //Watch out: -1 has a bitLength=0
1752         return bitLength == 0 && this.smallValue != -1;
1753     }
1754 
1755     /**
1756      * Returns the scale of this {@code BigDecimal}. The scale is the number of
1757      * digits behind the decimal point. The value of this {@code BigDecimal} is
1758      * the {@code unsignedValue * 10<sup>-scale</sup>}. If the scale is negative,
1759      * then this {@code BigDecimal} represents a big integer.
1760      *
1761      * @return the scale of this {@code BigDecimal}.
1762      */
scale()1763     public int scale() {
1764         return scale;
1765     }
1766 
1767     /**
1768      * Returns the precision of this {@code BigDecimal}. The precision is the
1769      * number of decimal digits used to represent this decimal. It is equivalent
1770      * to the number of digits of the unscaled value. The precision of {@code 0}
1771      * is {@code 1} (independent of the scale).
1772      *
1773      * @return the precision of this {@code BigDecimal}.
1774      */
precision()1775     public int precision() {
1776         // Return the cached value if we have one.
1777         if (precision != 0) {
1778             return precision;
1779         }
1780 
1781         if (bitLength == 0) {
1782             precision = 1;
1783         } else if (bitLength < 64) {
1784             precision = decimalDigitsInLong(smallValue);
1785         } else {
1786             int decimalDigits = 1 + (int) ((bitLength - 1) * LOG10_2);
1787             // If after division the number isn't zero, there exists an additional digit
1788             if (getUnscaledValue().divide(Multiplication.powerOf10(decimalDigits)).signum() != 0) {
1789                 decimalDigits++;
1790             }
1791             precision = decimalDigits;
1792         }
1793         return precision;
1794     }
1795 
decimalDigitsInLong(long value)1796     private int decimalDigitsInLong(long value) {
1797         if (value == Long.MIN_VALUE) {
1798             return 19; // special case required because abs(MIN_VALUE) == MIN_VALUE
1799         } else {
1800             int index = Arrays.binarySearch(MathUtils.LONG_POWERS_OF_TEN, Math.abs(value));
1801             return (index < 0) ? (-index - 1) : (index + 1);
1802         }
1803     }
1804 
1805     /**
1806      * Returns the unscaled value (mantissa) of this {@code BigDecimal} instance
1807      * as a {@code BigInteger}. The unscaled value can be computed as
1808      * {@code this * 10<sup>scale</sup>}.
1809      */
unscaledValue()1810     public BigInteger unscaledValue() {
1811         return getUnscaledValue();
1812     }
1813 
1814     /**
1815      * Returns a new {@code BigDecimal} whose value is {@code this}, rounded
1816      * according to the passed context {@code mc}.
1817      * <p>
1818      * If {@code mc.precision = 0}, then no rounding is performed.
1819      * <p>
1820      * If {@code mc.precision > 0} and {@code mc.roundingMode == UNNECESSARY},
1821      * then an {@code ArithmeticException} is thrown if the result cannot be
1822      * represented exactly within the given precision.
1823      *
1824      * @param mc
1825      *            rounding mode and precision for the result of this operation.
1826      * @return {@code this} rounded according to the passed context.
1827      * @throws ArithmeticException
1828      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
1829      *             UNNECESSARY} and this cannot be represented within the given
1830      *             precision.
1831      */
round(MathContext mc)1832     public BigDecimal round(MathContext mc) {
1833         BigDecimal thisBD = new BigDecimal(getUnscaledValue(), scale);
1834 
1835         thisBD.inplaceRound(mc);
1836         return thisBD;
1837     }
1838 
1839     /**
1840      * Returns a new {@code BigDecimal} instance with the specified scale.
1841      * <p>
1842      * If the new scale is greater than the old scale, then additional zeros are
1843      * added to the unscaled value. In this case no rounding is necessary.
1844      * <p>
1845      * If the new scale is smaller than the old scale, then trailing digits are
1846      * removed. If these trailing digits are not zero, then the remaining
1847      * unscaled value has to be rounded. For this rounding operation the
1848      * specified rounding mode is used.
1849      *
1850      * @param newScale
1851      *            scale of the result returned.
1852      * @param roundingMode
1853      *            rounding mode to be used to round the result.
1854      * @return a new {@code BigDecimal} instance with the specified scale.
1855      * @throws NullPointerException
1856      *             if {@code roundingMode == null}.
1857      * @throws ArithmeticException
1858      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
1859      *             necessary according to the given scale.
1860      */
setScale(int newScale, RoundingMode roundingMode)1861     public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
1862         if (roundingMode == null) {
1863             throw new NullPointerException("roundingMode == null");
1864         }
1865         long diffScale = newScale - (long)scale;
1866         // Let be:  'this' = [u,s]
1867         if(diffScale == 0) {
1868             return this;
1869         }
1870         if(diffScale > 0) {
1871         // return  [u * 10^(s2 - s), newScale]
1872             if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
1873                     (this.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)diffScale]) < 64 ) {
1874                 return valueOf(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)diffScale],newScale);
1875             }
1876             return new BigDecimal(Multiplication.multiplyByTenPow(getUnscaledValue(),(int)diffScale), newScale);
1877         }
1878         // diffScale < 0
1879         // return  [u,s] / [1,newScale]  with the appropriate scale and rounding
1880         if(this.bitLength < 64 && -diffScale < MathUtils.LONG_POWERS_OF_TEN.length) {
1881             return dividePrimitiveLongs(this.smallValue, MathUtils.LONG_POWERS_OF_TEN[(int)-diffScale], newScale,roundingMode);
1882         }
1883         return divideBigIntegers(this.getUnscaledValue(),Multiplication.powerOf10(-diffScale),newScale,roundingMode);
1884     }
1885 
1886     /**
1887      * Returns a new {@code BigDecimal} instance with the specified scale.
1888      * <p>
1889      * If the new scale is greater than the old scale, then additional zeros are
1890      * added to the unscaled value. In this case no rounding is necessary.
1891      * <p>
1892      * If the new scale is smaller than the old scale, then trailing digits are
1893      * removed. If these trailing digits are not zero, then the remaining
1894      * unscaled value has to be rounded. For this rounding operation the
1895      * specified rounding mode is used.
1896      *
1897      * @param newScale
1898      *            scale of the result returned.
1899      * @param roundingMode
1900      *            rounding mode to be used to round the result.
1901      * @return a new {@code BigDecimal} instance with the specified scale.
1902      * @throws IllegalArgumentException
1903      *             if {@code roundingMode} is not a valid rounding mode.
1904      * @throws ArithmeticException
1905      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
1906      *             necessary according to the given scale.
1907      */
setScale(int newScale, int roundingMode)1908     public BigDecimal setScale(int newScale, int roundingMode) {
1909         return setScale(newScale, RoundingMode.valueOf(roundingMode));
1910     }
1911 
1912     /**
1913      * Returns a new {@code BigDecimal} instance with the specified scale. If
1914      * the new scale is greater than the old scale, then additional zeros are
1915      * added to the unscaled value. If the new scale is smaller than the old
1916      * scale, then trailing zeros are removed. If the trailing digits are not
1917      * zeros then an ArithmeticException is thrown.
1918      * <p>
1919      * If no exception is thrown, then the following equation holds: {@code
1920      * x.setScale(s).compareTo(x) == 0}.
1921      *
1922      * @param newScale
1923      *            scale of the result returned.
1924      * @return a new {@code BigDecimal} instance with the specified scale.
1925      * @throws ArithmeticException
1926      *             if rounding would be necessary.
1927      */
setScale(int newScale)1928     public BigDecimal setScale(int newScale) {
1929         return setScale(newScale, RoundingMode.UNNECESSARY);
1930     }
1931 
1932     /**
1933      * Returns a new {@code BigDecimal} instance where the decimal point has
1934      * been moved {@code n} places to the left. If {@code n < 0} then the
1935      * decimal point is moved {@code -n} places to the right.
1936      *
1937      * <p>The result is obtained by changing its scale. If the scale of the result
1938      * becomes negative, then its precision is increased such that the scale is
1939      * zero.
1940      *
1941      * <p>Note, that {@code movePointLeft(0)} returns a result which is
1942      * mathematically equivalent, but which has {@code scale >= 0}.
1943      */
movePointLeft(int n)1944     public BigDecimal movePointLeft(int n) {
1945         return movePoint(scale + (long)n);
1946     }
1947 
movePoint(long newScale)1948     private BigDecimal movePoint(long newScale) {
1949         if (isZero()) {
1950             return zeroScaledBy(Math.max(newScale, 0));
1951         }
1952         /*
1953          * When: 'n'== Integer.MIN_VALUE isn't possible to call to
1954          * movePointRight(-n) since -Integer.MIN_VALUE == Integer.MIN_VALUE
1955          */
1956         if(newScale >= 0) {
1957             if(bitLength < 64) {
1958                 return valueOf(smallValue, safeLongToInt(newScale));
1959             }
1960             return new BigDecimal(getUnscaledValue(), safeLongToInt(newScale));
1961         }
1962         if(-newScale < MathUtils.LONG_POWERS_OF_TEN.length &&
1963                 bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)-newScale] < 64 ) {
1964             return valueOf(smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)-newScale],0);
1965         }
1966         return new BigDecimal(Multiplication.multiplyByTenPow(
1967                 getUnscaledValue(), safeLongToInt(-newScale)), 0);
1968     }
1969 
1970     /**
1971      * Returns a new {@code BigDecimal} instance where the decimal point has
1972      * been moved {@code n} places to the right. If {@code n < 0} then the
1973      * decimal point is moved {@code -n} places to the left.
1974      *
1975      * <p>The result is obtained by changing its scale. If the scale of the result
1976      * becomes negative, then its precision is increased such that the scale is
1977      * zero.
1978      *
1979      * <p>Note, that {@code movePointRight(0)} returns a result which is
1980      * mathematically equivalent, but which has scale >= 0.
1981      */
movePointRight(int n)1982     public BigDecimal movePointRight(int n) {
1983         return movePoint(scale - (long)n);
1984     }
1985 
1986     /**
1987      * Returns a new {@code BigDecimal} whose value is {@code this * 10<sup>n</sup>}.
1988      * The scale of the result is {@code this.scale()} - {@code n}.
1989      * The precision of the result is the precision of {@code this}.
1990      *
1991      * <p>This method has the same effect as {@link #movePointRight}, except that
1992      * the precision is not changed.
1993      */
scaleByPowerOfTen(int n)1994     public BigDecimal scaleByPowerOfTen(int n) {
1995         long newScale = scale - (long)n;
1996         if(bitLength < 64) {
1997             //Taking care when a 0 is to be scaled
1998             if( smallValue==0  ){
1999                 return zeroScaledBy( newScale );
2000             }
2001             return valueOf(smallValue, safeLongToInt(newScale));
2002         }
2003         return new BigDecimal(getUnscaledValue(), safeLongToInt(newScale));
2004     }
2005 
2006     /**
2007      * Returns a new {@code BigDecimal} instance with the same value as {@code
2008      * this} but with a unscaled value where the trailing zeros have been
2009      * removed. If the unscaled value of {@code this} has n trailing zeros, then
2010      * the scale and the precision of the result has been reduced by n.
2011      *
2012      * @return a new {@code BigDecimal} instance equivalent to this where the
2013      *         trailing zeros of the unscaled value have been removed.
2014      */
stripTrailingZeros()2015     public BigDecimal stripTrailingZeros() {
2016         int i = 1; // 1 <= i <= 18
2017         int lastPow = TEN_POW.length - 1;
2018         long newScale = scale;
2019 
2020         if (isZero()) {
2021             // Preserve RI compatibility, so BigDecimal.equals (which checks
2022             // value *and* scale) continues to work.
2023             return this;
2024         }
2025         BigInteger strippedBI = getUnscaledValue();
2026         BigInteger[] quotAndRem;
2027 
2028         // while the number is even...
2029         while (!strippedBI.testBit(0)) {
2030             // To divide by 10^i
2031             quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
2032             // To look the remainder
2033             if (quotAndRem[1].signum() == 0) {
2034                 // To adjust the scale
2035                 newScale -= i;
2036                 if (i < lastPow) {
2037                     // To set to the next power
2038                     i++;
2039                 }
2040                 strippedBI = quotAndRem[0];
2041             } else {
2042                 if (i == 1) {
2043                     // 'this' has no more trailing zeros
2044                     break;
2045                 }
2046                 // To set to the smallest power of ten
2047                 i = 1;
2048             }
2049         }
2050         return new BigDecimal(strippedBI, safeLongToInt(newScale));
2051     }
2052 
2053     /**
2054      * Compares this {@code BigDecimal} with {@code val}. Returns one of the
2055      * three values {@code 1}, {@code 0}, or {@code -1}. The method behaves as
2056      * if {@code this.subtract(val)} is computed. If this difference is > 0 then
2057      * 1 is returned, if the difference is < 0 then -1 is returned, and if the
2058      * difference is 0 then 0 is returned. This means, that if two decimal
2059      * instances are compared which are equal in value but differ in scale, then
2060      * these two instances are considered as equal.
2061      *
2062      * @param val
2063      *            value to be compared with {@code this}.
2064      * @return {@code 1} if {@code this > val}, {@code -1} if {@code this < val},
2065      *         {@code 0} if {@code this == val}.
2066      * @throws NullPointerException
2067      *             if {@code val == null}.
2068      */
compareTo(BigDecimal val)2069     public int compareTo(BigDecimal val) {
2070         int thisSign = signum();
2071         int valueSign = val.signum();
2072 
2073         if( thisSign == valueSign) {
2074             if(this.scale == val.scale && this.bitLength<64 && val.bitLength<64 ) {
2075                 return (smallValue < val.smallValue) ? -1 : (smallValue > val.smallValue) ? 1 : 0;
2076             }
2077             long diffScale = (long)this.scale - val.scale;
2078             int diffPrecision = this.approxPrecision() - val.approxPrecision();
2079             if (diffPrecision > diffScale + 1) {
2080                 return thisSign;
2081             } else if (diffPrecision < diffScale - 1) {
2082                 return -thisSign;
2083             } else {// thisSign == val.signum()  and  diffPrecision is aprox. diffScale
2084                 BigInteger thisUnscaled = this.getUnscaledValue();
2085                 BigInteger valUnscaled = val.getUnscaledValue();
2086                 // If any of both precision is bigger, append zeros to the shorter one
2087                 if (diffScale < 0) {
2088                     thisUnscaled = thisUnscaled.multiply(Multiplication.powerOf10(-diffScale));
2089                 } else if (diffScale > 0) {
2090                     valUnscaled = valUnscaled.multiply(Multiplication.powerOf10(diffScale));
2091                 }
2092                 return thisUnscaled.compareTo(valUnscaled);
2093             }
2094         } else if (thisSign < valueSign) {
2095             return -1;
2096         } else  {
2097             return 1;
2098         }
2099     }
2100 
2101     /**
2102      * Returns {@code true} if {@code x} is a {@code BigDecimal} instance and if
2103      * this instance is equal to this big decimal. Two big decimals are equal if
2104      * their unscaled value and their scale is equal. For example, 1.0
2105      * (10*10<sup>-1</sup>) is not equal to 1.00 (100*10<sup>-2</sup>). Similarly, zero
2106      * instances are not equal if their scale differs.
2107      */
2108     @Override
equals(Object x)2109     public boolean equals(Object x) {
2110         if (this == x) {
2111             return true;
2112         }
2113         if (x instanceof BigDecimal) {
2114             BigDecimal x1 = (BigDecimal) x;
2115             return x1.scale == scale
2116                    && (bitLength < 64 ? (x1.smallValue == smallValue)
2117                     : intVal.equals(x1.intVal));
2118         }
2119         return false;
2120     }
2121 
2122     /**
2123      * Returns the minimum of this {@code BigDecimal} and {@code val}.
2124      *
2125      * @param val
2126      *            value to be used to compute the minimum with this.
2127      * @return {@code min(this, val}.
2128      * @throws NullPointerException
2129      *             if {@code val == null}.
2130      */
min(BigDecimal val)2131     public BigDecimal min(BigDecimal val) {
2132         return ((compareTo(val) <= 0) ? this : val);
2133     }
2134 
2135     /**
2136      * Returns the maximum of this {@code BigDecimal} and {@code val}.
2137      *
2138      * @param val
2139      *            value to be used to compute the maximum with this.
2140      * @return {@code max(this, val}.
2141      * @throws NullPointerException
2142      *             if {@code val == null}.
2143      */
max(BigDecimal val)2144     public BigDecimal max(BigDecimal val) {
2145         return ((compareTo(val) >= 0) ? this : val);
2146     }
2147 
2148     /**
2149      * Returns a hash code for this {@code BigDecimal}.
2150      *
2151      * @return hash code for {@code this}.
2152      */
2153     @Override
hashCode()2154     public int hashCode() {
2155         if (hashCode != 0) {
2156             return hashCode;
2157         }
2158         if (bitLength < 64) {
2159             hashCode = (int)(smallValue & 0xffffffff);
2160             hashCode = 33 * hashCode +  (int)((smallValue >> 32) & 0xffffffff);
2161             hashCode = 17 * hashCode + scale;
2162             return hashCode;
2163         }
2164         hashCode = 17 * intVal.hashCode() + scale;
2165         return hashCode;
2166     }
2167 
2168     /**
2169      * Returns a canonical string representation of this {@code BigDecimal}. If
2170      * necessary, scientific notation is used. This representation always prints
2171      * all significant digits of this value.
2172      * <p>
2173      * If the scale is negative or if {@code scale - precision >= 6} then
2174      * scientific notation is used.
2175      *
2176      * @return a string representation of {@code this} in scientific notation if
2177      *         necessary.
2178      */
2179     @Override
toString()2180     public String toString() {
2181         if (toStringImage != null) {
2182             return toStringImage;
2183         }
2184         if(bitLength < 32) {
2185             toStringImage = Conversion.toDecimalScaledString(smallValue,scale);
2186             return toStringImage;
2187         }
2188         String intString = getUnscaledValue().toString();
2189         if (scale == 0) {
2190             return intString;
2191         }
2192         int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
2193         int end = intString.length();
2194         long exponent = -(long)scale + end - begin;
2195         StringBuilder result = new StringBuilder();
2196 
2197         result.append(intString);
2198         if ((scale > 0) && (exponent >= -6)) {
2199             if (exponent >= 0) {
2200                 result.insert(end - scale, '.');
2201             } else {
2202                 result.insert(begin - 1, "0.");
2203                 result.insert(begin + 1, CH_ZEROS, 0, -(int)exponent - 1);
2204             }
2205         } else {
2206             if (end - begin >= 1) {
2207                 result.insert(begin, '.');
2208                 end++;
2209             }
2210             result.insert(end, 'E');
2211             if (exponent > 0) {
2212                 result.insert(++end, '+');
2213             }
2214             result.insert(++end, Long.toString(exponent));
2215         }
2216         toStringImage = result.toString();
2217         return toStringImage;
2218     }
2219 
2220     /**
2221      * Returns a string representation of this {@code BigDecimal}. This
2222      * representation always prints all significant digits of this value.
2223      * <p>
2224      * If the scale is negative or if {@code scale - precision >= 6} then
2225      * engineering notation is used. Engineering notation is similar to the
2226      * scientific notation except that the exponent is made to be a multiple of
2227      * 3 such that the integer part is >= 1 and < 1000.
2228      *
2229      * @return a string representation of {@code this} in engineering notation
2230      *         if necessary.
2231      */
toEngineeringString()2232     public String toEngineeringString() {
2233         String intString = getUnscaledValue().toString();
2234         if (scale == 0) {
2235             return intString;
2236         }
2237         int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
2238         int end = intString.length();
2239         long exponent = -(long)scale + end - begin;
2240         StringBuilder result = new StringBuilder(intString);
2241 
2242         if ((scale > 0) && (exponent >= -6)) {
2243             if (exponent >= 0) {
2244                 result.insert(end - scale, '.');
2245             } else {
2246                 result.insert(begin - 1, "0.");
2247                 result.insert(begin + 1, CH_ZEROS, 0, -(int)exponent - 1);
2248             }
2249         } else {
2250             int delta = end - begin;
2251             int rem = (int)(exponent % 3);
2252 
2253             if (rem != 0) {
2254                 // adjust exponent so it is a multiple of three
2255                 if (getUnscaledValue().signum() == 0) {
2256                     // zero value
2257                     rem = (rem < 0) ? -rem : 3 - rem;
2258                     exponent += rem;
2259                 } else {
2260                     // nonzero value
2261                     rem = (rem < 0) ? rem + 3 : rem;
2262                     exponent -= rem;
2263                     begin += rem;
2264                 }
2265                 if (delta < 3) {
2266                     for (int i = rem - delta; i > 0; i--) {
2267                         result.insert(end++, '0');
2268                     }
2269                 }
2270             }
2271             if (end - begin >= 1) {
2272                 result.insert(begin, '.');
2273                 end++;
2274             }
2275             if (exponent != 0) {
2276                 result.insert(end, 'E');
2277                 if (exponent > 0) {
2278                     result.insert(++end, '+');
2279                 }
2280                 result.insert(++end, Long.toString(exponent));
2281             }
2282         }
2283         return result.toString();
2284     }
2285 
2286     /**
2287      * Returns a string representation of this {@code BigDecimal}. No scientific
2288      * notation is used. This methods adds zeros where necessary.
2289      * <p>
2290      * If this string representation is used to create a new instance, this
2291      * instance is generally not identical to {@code this} as the precision
2292      * changes.
2293      * <p>
2294      * {@code x.equals(new BigDecimal(x.toPlainString())} usually returns
2295      * {@code false}.
2296      * <p>
2297      * {@code x.compareTo(new BigDecimal(x.toPlainString())} returns {@code 0}.
2298      *
2299      * @return a string representation of {@code this} without exponent part.
2300      */
toPlainString()2301     public String toPlainString() {
2302         String intStr = getUnscaledValue().toString();
2303         if ((scale == 0) || ((isZero()) && (scale < 0))) {
2304             return intStr;
2305         }
2306         int begin = (signum() < 0) ? 1 : 0;
2307         int delta = scale;
2308         // We take space for all digits, plus a possible decimal point, plus 'scale'
2309         StringBuilder result = new StringBuilder(intStr.length() + 1 + Math.abs(scale));
2310 
2311         if (begin == 1) {
2312             // If the number is negative, we insert a '-' character at front
2313             result.append('-');
2314         }
2315         if (scale > 0) {
2316             delta -= (intStr.length() - begin);
2317             if (delta >= 0) {
2318                 result.append("0.");
2319                 // To append zeros after the decimal point
2320                 for (; delta > CH_ZEROS.length; delta -= CH_ZEROS.length) {
2321                     result.append(CH_ZEROS);
2322                 }
2323                 result.append(CH_ZEROS, 0, delta);
2324                 result.append(intStr.substring(begin));
2325             } else {
2326                 delta = begin - delta;
2327                 result.append(intStr.substring(begin, delta));
2328                 result.append('.');
2329                 result.append(intStr.substring(delta));
2330             }
2331         } else {// (scale <= 0)
2332             result.append(intStr.substring(begin));
2333             // To append trailing zeros
2334             for (; delta < -CH_ZEROS.length; delta += CH_ZEROS.length) {
2335                 result.append(CH_ZEROS);
2336             }
2337             result.append(CH_ZEROS, 0, -delta);
2338         }
2339         return result.toString();
2340     }
2341 
2342     /**
2343      * Returns this {@code BigDecimal} as a big integer instance. A fractional
2344      * part is discarded.
2345      *
2346      * @return this {@code BigDecimal} as a big integer instance.
2347      */
toBigInteger()2348     public BigInteger toBigInteger() {
2349         if ((scale == 0) || (isZero())) {
2350             return getUnscaledValue();
2351         } else if (scale < 0) {
2352             return getUnscaledValue().multiply(Multiplication.powerOf10(-(long)scale));
2353         } else {// (scale > 0)
2354             return getUnscaledValue().divide(Multiplication.powerOf10(scale));
2355         }
2356     }
2357 
2358     /**
2359      * Returns this {@code BigDecimal} as a big integer instance if it has no
2360      * fractional part. If this {@code BigDecimal} has a fractional part, i.e.
2361      * if rounding would be necessary, an {@code ArithmeticException} is thrown.
2362      *
2363      * @return this {@code BigDecimal} as a big integer value.
2364      * @throws ArithmeticException
2365      *             if rounding is necessary.
2366      */
toBigIntegerExact()2367     public BigInteger toBigIntegerExact() {
2368         if ((scale == 0) || (isZero())) {
2369             return getUnscaledValue();
2370         } else if (scale < 0) {
2371             return getUnscaledValue().multiply(Multiplication.powerOf10(-(long)scale));
2372         } else {// (scale > 0)
2373             BigInteger[] integerAndFraction;
2374             // An optimization before do a heavy division
2375             if ((scale > approxPrecision()) || (scale > getUnscaledValue().getLowestSetBit())) {
2376                 throw new ArithmeticException("Rounding necessary");
2377             }
2378             integerAndFraction = getUnscaledValue().divideAndRemainder(Multiplication.powerOf10(scale));
2379             if (integerAndFraction[1].signum() != 0) {
2380                 // It exists a non-zero fractional part
2381                 throw new ArithmeticException("Rounding necessary");
2382             }
2383             return integerAndFraction[0];
2384         }
2385     }
2386 
2387     /**
2388      * Returns this {@code BigDecimal} as an long value. Any fractional part is
2389      * discarded. If the integral part of {@code this} is too big to be
2390      * represented as an long, then {@code this % 2<sup>64</sup>} is returned.
2391      */
2392     @Override
longValue()2393     public long longValue() {
2394         /*
2395          * If scale <= -64 there are at least 64 trailing bits zero in
2396          * 10^(-scale). If the scale is positive and very large the long value
2397          * could be zero.
2398          */
2399         return ((scale <= -64) || (scale > approxPrecision()) ? 0L : toBigInteger().longValue());
2400     }
2401 
2402     /**
2403      * Returns this {@code BigDecimal} as a long value if it has no fractional
2404      * part and if its value fits to the int range ([-2<sup>63</sup>..2<sup>63</sup>-1]). If
2405      * these conditions are not met, an {@code ArithmeticException} is thrown.
2406      *
2407      * @throws ArithmeticException
2408      *             if rounding is necessary or the number doesn't fit in a long.
2409      */
longValueExact()2410     public long longValueExact() {
2411         return valueExact(64);
2412     }
2413 
2414     /**
2415      * Returns this {@code BigDecimal} as an int value. Any fractional part is
2416      * discarded. If the integral part of {@code this} is too big to be
2417      * represented as an int, then {@code this % 2<sup>32</sup>} is returned.
2418      */
2419     @Override
intValue()2420     public int intValue() {
2421         /*
2422          * If scale <= -32 there are at least 32 trailing bits zero in
2423          * 10^(-scale). If the scale is positive and very large the long value
2424          * could be zero.
2425          */
2426         return ((scale <= -32) || (scale > approxPrecision()) ? 0 : toBigInteger().intValue());
2427     }
2428 
2429     /**
2430      * Returns this {@code BigDecimal} as a int value if it has no fractional
2431      * part and if its value fits to the int range ([-2<sup>31</sup>..2<sup>31</sup>-1]). If
2432      * these conditions are not met, an {@code ArithmeticException} is thrown.
2433      *
2434      * @throws ArithmeticException
2435      *             if rounding is necessary or the number doesn't fit in an int.
2436      */
intValueExact()2437     public int intValueExact() {
2438         return (int) valueExact(32);
2439     }
2440 
2441     /**
2442      * Returns this {@code BigDecimal} as a short value if it has no fractional
2443      * part and if its value fits to the short range ([-2<sup>15</sup>..2<sup>15</sup>-1]). If
2444      * these conditions are not met, an {@code ArithmeticException} is thrown.
2445      *
2446      * @throws ArithmeticException
2447      *             if rounding is necessary of the number doesn't fit in a short.
2448      */
shortValueExact()2449     public short shortValueExact() {
2450         return (short) valueExact(16);
2451     }
2452 
2453     /**
2454      * Returns this {@code BigDecimal} as a byte value if it has no fractional
2455      * part and if its value fits to the byte range ([-128..127]). If these
2456      * conditions are not met, an {@code ArithmeticException} is thrown.
2457      *
2458      * @throws ArithmeticException
2459      *             if rounding is necessary or the number doesn't fit in a byte.
2460      */
byteValueExact()2461     public byte byteValueExact() {
2462         return (byte) valueExact(8);
2463     }
2464 
2465     /**
2466      * Returns this {@code BigDecimal} as a float value. If {@code this} is too
2467      * big to be represented as an float, then {@code Float.POSITIVE_INFINITY}
2468      * or {@code Float.NEGATIVE_INFINITY} is returned.
2469      * <p>
2470      * Note, that if the unscaled value has more than 24 significant digits,
2471      * then this decimal cannot be represented exactly in a float variable. In
2472      * this case the result is rounded.
2473      * <p>
2474      * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
2475      * represented exactly as a float, and thus {@code x1.equals(new
2476      * BigDecimal(x1.floatValue())} returns {@code false} for this case.
2477      * <p>
2478      * Similarly, if the instance {@code new BigDecimal(16777217)} is converted
2479      * to a float, the result is {@code 1.6777216E}7.
2480      *
2481      * @return this {@code BigDecimal} as a float value.
2482      */
2483     @Override
floatValue()2484     public float floatValue() {
2485         /* A similar code like in doubleValue() could be repeated here,
2486          * but this simple implementation is quite efficient. */
2487         float floatResult = signum();
2488         long powerOfTwo = this.bitLength - (long)(scale / LOG10_2);
2489         if ((powerOfTwo < -149) || (floatResult == 0.0f)) {
2490             // Cases which 'this' is very small
2491             floatResult *= 0.0f;
2492         } else if (powerOfTwo > 129) {
2493             // Cases which 'this' is very large
2494             floatResult *= Float.POSITIVE_INFINITY;
2495         } else {
2496             floatResult = (float)doubleValue();
2497         }
2498         return floatResult;
2499     }
2500 
2501     /**
2502      * Returns this {@code BigDecimal} as a double value. If {@code this} is too
2503      * big to be represented as an float, then {@code Double.POSITIVE_INFINITY}
2504      * or {@code Double.NEGATIVE_INFINITY} is returned.
2505      * <p>
2506      * Note, that if the unscaled value has more than 53 significant digits,
2507      * then this decimal cannot be represented exactly in a double variable. In
2508      * this case the result is rounded.
2509      * <p>
2510      * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
2511      * represented exactly as a double, and thus {@code x1.equals(new
2512      * BigDecimal(x1.doubleValue())} returns {@code false} for this case.
2513      * <p>
2514      * Similarly, if the instance {@code new BigDecimal(9007199254740993L)} is
2515      * converted to a double, the result is {@code 9.007199254740992E15}.
2516      * <p>
2517      *
2518      * @return this {@code BigDecimal} as a double value.
2519      */
2520     @Override
doubleValue()2521     public double doubleValue() {
2522         int sign = signum();
2523         int exponent = 1076; // bias + 53
2524         int lowestSetBit;
2525         int discardedSize;
2526         long powerOfTwo = this.bitLength - (long)(scale / LOG10_2);
2527         long bits; // IEEE-754 Standard
2528         long tempBits; // for temporal calculations
2529         BigInteger mantissa;
2530 
2531         if ((powerOfTwo < -1074) || (sign == 0)) {
2532             // Cases which 'this' is very small
2533             return (sign * 0.0d);
2534         } else if (powerOfTwo > 1025) {
2535             // Cases which 'this' is very large
2536             return (sign * Double.POSITIVE_INFINITY);
2537         }
2538         mantissa = getUnscaledValue().abs();
2539         // Let be:  this = [u,s], with s > 0
2540         if (scale <= 0) {
2541             // mantissa = abs(u) * 10^s
2542             mantissa = mantissa.multiply(Multiplication.powerOf10(-scale));
2543         } else {// (scale > 0)
2544             BigInteger quotAndRem[];
2545             BigInteger powerOfTen = Multiplication.powerOf10(scale);
2546             int k = 100 - (int)powerOfTwo;
2547             int compRem;
2548 
2549             if (k > 0) {
2550                 /* Computing (mantissa * 2^k) , where 'k' is a enough big
2551                  * power of '2' to can divide by 10^s */
2552                 mantissa = mantissa.shiftLeft(k);
2553                 exponent -= k;
2554             }
2555             // Computing (mantissa * 2^k) / 10^s
2556             quotAndRem = mantissa.divideAndRemainder(powerOfTen);
2557             // To check if the fractional part >= 0.5
2558             compRem = quotAndRem[1].shiftLeftOneBit().compareTo(powerOfTen);
2559             // To add two rounded bits at end of mantissa
2560             mantissa = quotAndRem[0].shiftLeft(2).add(
2561                     BigInteger.valueOf((compRem * (compRem + 3)) / 2 + 1));
2562             exponent -= 2;
2563         }
2564         lowestSetBit = mantissa.getLowestSetBit();
2565         discardedSize = mantissa.bitLength() - 54;
2566         if (discardedSize > 0) {// (n > 54)
2567             // mantissa = (abs(u) * 10^s) >> (n - 54)
2568             bits = mantissa.shiftRight(discardedSize).longValue();
2569             tempBits = bits;
2570             // #bits = 54, to check if the discarded fraction produces a carry
2571             if ((((bits & 1) == 1) && (lowestSetBit < discardedSize))
2572                     || ((bits & 3) == 3)) {
2573                 bits += 2;
2574             }
2575         } else {// (n <= 54)
2576             // mantissa = (abs(u) * 10^s) << (54 - n)
2577             bits = mantissa.longValue() << -discardedSize;
2578             tempBits = bits;
2579             // #bits = 54, to check if the discarded fraction produces a carry:
2580             if ((bits & 3) == 3) {
2581                 bits += 2;
2582             }
2583         }
2584         // Testing bit 54 to check if the carry creates a new binary digit
2585         if ((bits & 0x40000000000000L) == 0) {
2586             // To drop the last bit of mantissa (first discarded)
2587             bits >>= 1;
2588             // exponent = 2^(s-n+53+bias)
2589             exponent += discardedSize;
2590         } else {// #bits = 54
2591             bits >>= 2;
2592             exponent += discardedSize + 1;
2593         }
2594         // To test if the 53-bits number fits in 'double'
2595         if (exponent > 2046) {// (exponent - bias > 1023)
2596             return (sign * Double.POSITIVE_INFINITY);
2597         } else if (exponent <= 0) {// (exponent - bias <= -1023)
2598             // Denormalized numbers (having exponent == 0)
2599             if (exponent < -53) {// exponent - bias < -1076
2600                 return (sign * 0.0d);
2601             }
2602             // -1076 <= exponent - bias <= -1023
2603             // To discard '- exponent + 1' bits
2604             bits = tempBits >> 1;
2605             tempBits = bits & (-1L >>> (63 + exponent));
2606             bits >>= (-exponent );
2607             // To test if after discard bits, a new carry is generated
2608             if (((bits & 3) == 3) || (((bits & 1) == 1) && (tempBits != 0)
2609             && (lowestSetBit < discardedSize))) {
2610                 bits += 1;
2611             }
2612             exponent = 0;
2613             bits >>= 1;
2614         }
2615         // Construct the 64 double bits: [sign(1), exponent(11), mantissa(52)]
2616         bits = (sign & 0x8000000000000000L) | ((long)exponent << 52)
2617                 | (bits & 0xFFFFFFFFFFFFFL);
2618         return Double.longBitsToDouble(bits);
2619     }
2620 
2621     /**
2622      * Returns the unit in the last place (ULP) of this {@code BigDecimal}
2623      * instance. An ULP is the distance to the nearest big decimal with the same
2624      * precision.
2625      *
2626      * <p>The amount of a rounding error in the evaluation of a floating-point
2627      * operation is often expressed in ULPs. An error of 1 ULP is often seen as
2628      * a tolerable error.
2629      *
2630      * <p>For class {@code BigDecimal}, the ULP of a number is simply 10<sup>-scale</sup>.
2631      * For example, {@code new BigDecimal(0.1).ulp()} returns {@code 1E-55}.
2632      *
2633      * @return unit in the last place (ULP) of this {@code BigDecimal} instance.
2634      */
ulp()2635     public BigDecimal ulp() {
2636         return valueOf(1, scale);
2637     }
2638 
2639     /* Private Methods */
2640 
2641     /**
2642      * It does all rounding work of the public method
2643      * {@code round(MathContext)}, performing an inplace rounding
2644      * without creating a new object.
2645      *
2646      * @param mc
2647      *            the {@code MathContext} for perform the rounding.
2648      * @see #round(MathContext)
2649      */
inplaceRound(MathContext mc)2650     private void inplaceRound(MathContext mc) {
2651         int mcPrecision = mc.getPrecision();
2652         if (approxPrecision() < mcPrecision || mcPrecision == 0) {
2653             return;
2654         }
2655         int discardedPrecision = precision() - mcPrecision;
2656         // If no rounding is necessary it returns immediately
2657         if ((discardedPrecision <= 0)) {
2658             return;
2659         }
2660         // When the number is small perform an efficient rounding
2661         if (this.bitLength < 64) {
2662             smallRound(mc, discardedPrecision);
2663             return;
2664         }
2665         // Getting the integer part and the discarded fraction
2666         BigInteger sizeOfFraction = Multiplication.powerOf10(discardedPrecision);
2667         BigInteger[] integerAndFraction = getUnscaledValue().divideAndRemainder(sizeOfFraction);
2668         long newScale = (long)scale - discardedPrecision;
2669         int compRem;
2670         BigDecimal tempBD;
2671         // If the discarded fraction is non-zero, perform rounding
2672         if (integerAndFraction[1].signum() != 0) {
2673             // To check if the discarded fraction >= 0.5
2674             compRem = (integerAndFraction[1].abs().shiftLeftOneBit().compareTo(sizeOfFraction));
2675             // To look if there is a carry
2676             compRem =  roundingBehavior( integerAndFraction[0].testBit(0) ? 1 : 0,
2677                     integerAndFraction[1].signum() * (5 + compRem),
2678                     mc.getRoundingMode());
2679             if (compRem != 0) {
2680                 integerAndFraction[0] = integerAndFraction[0].add(BigInteger.valueOf(compRem));
2681             }
2682             tempBD = new BigDecimal(integerAndFraction[0]);
2683             // If after to add the increment the precision changed, we normalize the size
2684             if (tempBD.precision() > mcPrecision) {
2685                 integerAndFraction[0] = integerAndFraction[0].divide(BigInteger.TEN);
2686                 newScale--;
2687             }
2688         }
2689         // To update all internal fields
2690         scale = safeLongToInt(newScale);
2691         precision = mcPrecision;
2692         setUnscaledValue(integerAndFraction[0]);
2693     }
2694 
longCompareTo(long value1, long value2)2695     private static int longCompareTo(long value1, long value2) {
2696         return value1 > value2 ? 1 : (value1 < value2 ? -1 : 0);
2697     }
2698     /**
2699      * This method implements an efficient rounding for numbers which unscaled
2700      * value fits in the type {@code long}.
2701      *
2702      * @param mc
2703      *            the context to use
2704      * @param discardedPrecision
2705      *            the number of decimal digits that are discarded
2706      * @see #round(MathContext)
2707      */
smallRound(MathContext mc, int discardedPrecision)2708     private void smallRound(MathContext mc, int discardedPrecision) {
2709         long sizeOfFraction = MathUtils.LONG_POWERS_OF_TEN[discardedPrecision];
2710         long newScale = (long)scale - discardedPrecision;
2711         long unscaledVal = smallValue;
2712         // Getting the integer part and the discarded fraction
2713         long integer = unscaledVal / sizeOfFraction;
2714         long fraction = unscaledVal % sizeOfFraction;
2715         int compRem;
2716         // If the discarded fraction is non-zero perform rounding
2717         if (fraction != 0) {
2718             // To check if the discarded fraction >= 0.5
2719             compRem = longCompareTo(Math.abs(fraction) * 2, sizeOfFraction);
2720             // To look if there is a carry
2721             integer += roundingBehavior( ((int)integer) & 1,
2722                     Long.signum(fraction) * (5 + compRem),
2723                     mc.getRoundingMode());
2724             // If after to add the increment the precision changed, we normalize the size
2725             if (Math.log10(Math.abs(integer)) >= mc.getPrecision()) {
2726                 integer /= 10;
2727                 newScale--;
2728             }
2729         }
2730         // To update all internal fields
2731         scale = safeLongToInt(newScale);
2732         precision = mc.getPrecision();
2733         smallValue = integer;
2734         bitLength = bitLength(integer);
2735         intVal = null;
2736     }
2737 
2738     /**
2739      * Return an increment that can be -1,0 or 1, depending of
2740      * {@code roundingMode}.
2741      *
2742      * @param parityBit
2743      *            can be 0 or 1, it's only used in the case
2744      *            {@code HALF_EVEN}
2745      * @param fraction
2746      *            the mantissa to be analyzed
2747      * @param roundingMode
2748      *            the type of rounding
2749      * @return the carry propagated after rounding
2750      */
roundingBehavior(int parityBit, int fraction, RoundingMode roundingMode)2751     private static int roundingBehavior(int parityBit, int fraction, RoundingMode roundingMode) {
2752         int increment = 0; // the carry after rounding
2753 
2754         switch (roundingMode) {
2755             case UNNECESSARY:
2756                 if (fraction != 0) {
2757                     throw new ArithmeticException("Rounding necessary");
2758                 }
2759                 break;
2760             case UP:
2761                 increment = Integer.signum(fraction);
2762                 break;
2763             case DOWN:
2764                 break;
2765             case CEILING:
2766                 increment = Math.max(Integer.signum(fraction), 0);
2767                 break;
2768             case FLOOR:
2769                 increment = Math.min(Integer.signum(fraction), 0);
2770                 break;
2771             case HALF_UP:
2772                 if (Math.abs(fraction) >= 5) {
2773                     increment = Integer.signum(fraction);
2774                 }
2775                 break;
2776             case HALF_DOWN:
2777                 if (Math.abs(fraction) > 5) {
2778                     increment = Integer.signum(fraction);
2779                 }
2780                 break;
2781             case HALF_EVEN:
2782                 if (Math.abs(fraction) + parityBit > 5) {
2783                     increment = Integer.signum(fraction);
2784                 }
2785                 break;
2786         }
2787         return increment;
2788     }
2789 
2790     /**
2791      * If {@code intVal} has a fractional part throws an exception,
2792      * otherwise it counts the number of bits of value and checks if it's out of
2793      * the range of the primitive type. If the number fits in the primitive type
2794      * returns this number as {@code long}, otherwise throws an
2795      * exception.
2796      *
2797      * @param bitLengthOfType
2798      *            number of bits of the type whose value will be calculated
2799      *            exactly
2800      * @return the exact value of the integer part of {@code BigDecimal}
2801      *         when is possible
2802      * @throws ArithmeticException when rounding is necessary or the
2803      *             number don't fit in the primitive type
2804      */
valueExact(int bitLengthOfType)2805     private long valueExact(int bitLengthOfType) {
2806         BigInteger bigInteger = toBigIntegerExact();
2807 
2808         if (bigInteger.bitLength() < bitLengthOfType) {
2809             // It fits in the primitive type
2810             return bigInteger.longValue();
2811         }
2812         throw new ArithmeticException("Rounding necessary");
2813     }
2814 
2815     /**
2816      * If the precision already was calculated it returns that value, otherwise
2817      * it calculates a very good approximation efficiently . Note that this
2818      * value will be {@code precision()} or {@code precision()-1}
2819      * in the worst case.
2820      *
2821      * @return an approximation of {@code precision()} value
2822      */
approxPrecision()2823     private int approxPrecision() {
2824         return precision > 0
2825                 ? precision
2826                 : (int) ((this.bitLength - 1) * LOG10_2) + 1;
2827     }
2828 
safeLongToInt(long longValue)2829     private static int safeLongToInt(long longValue) {
2830         if (longValue < Integer.MIN_VALUE || longValue > Integer.MAX_VALUE) {
2831             throw new ArithmeticException("Out of int range: " + longValue);
2832         }
2833         return (int) longValue;
2834     }
2835 
2836     /**
2837      * It returns the value 0 with the most approximated scale of type
2838      * {@code int}. if {@code longScale > Integer.MAX_VALUE} the
2839      * scale will be {@code Integer.MAX_VALUE}; if
2840      * {@code longScale < Integer.MIN_VALUE} the scale will be
2841      * {@code Integer.MIN_VALUE}; otherwise {@code longScale} is
2842      * casted to the type {@code int}.
2843      *
2844      * @param longScale
2845      *            the scale to which the value 0 will be scaled.
2846      * @return the value 0 scaled by the closer scale of type {@code int}.
2847      * @see #scale
2848      */
zeroScaledBy(long longScale)2849     private static BigDecimal zeroScaledBy(long longScale) {
2850         if (longScale == (int) longScale) {
2851             return valueOf(0,(int)longScale);
2852             }
2853         if (longScale >= 0) {
2854             return new BigDecimal( 0, Integer.MAX_VALUE);
2855         }
2856         return new BigDecimal( 0, Integer.MIN_VALUE);
2857     }
2858 
2859     /**
2860      * Assigns all transient fields upon deserialization of a
2861      * {@code BigDecimal} instance (bitLength and smallValue). The transient
2862      * field precision is assigned lazily.
2863      */
readObject(ObjectInputStream in)2864     private void readObject(ObjectInputStream in) throws IOException,
2865             ClassNotFoundException {
2866         in.defaultReadObject();
2867 
2868         this.bitLength = intVal.bitLength();
2869         if (this.bitLength < 64) {
2870             this.smallValue = intVal.longValue();
2871         }
2872     }
2873 
2874     /**
2875      * Prepares this {@code BigDecimal} for serialization, i.e. the
2876      * non-transient field {@code intVal} is assigned.
2877      */
writeObject(ObjectOutputStream out)2878     private void writeObject(ObjectOutputStream out) throws IOException {
2879         getUnscaledValue();
2880         out.defaultWriteObject();
2881     }
2882 
getUnscaledValue()2883     private BigInteger getUnscaledValue() {
2884         if(intVal == null) {
2885             intVal = BigInteger.valueOf(smallValue);
2886         }
2887         return intVal;
2888     }
2889 
setUnscaledValue(BigInteger unscaledValue)2890     private void setUnscaledValue(BigInteger unscaledValue) {
2891         this.intVal = unscaledValue;
2892         this.bitLength = unscaledValue.bitLength();
2893         if(this.bitLength < 64) {
2894             this.smallValue = unscaledValue.longValue();
2895         }
2896     }
2897 
bitLength(long smallValue)2898     private static int bitLength(long smallValue) {
2899         if(smallValue < 0) {
2900             smallValue = ~smallValue;
2901         }
2902         return 64 - Long.numberOfLeadingZeros(smallValue);
2903     }
2904 
bitLength(int smallValue)2905     private static int bitLength(int smallValue) {
2906         if(smallValue < 0) {
2907             smallValue = ~smallValue;
2908         }
2909         return 32 - Integer.numberOfLeadingZeros(smallValue);
2910     }
2911 
2912 }
2913