Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/java/math/BigDecimal.java
38829 views
1
/*
2
* Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
/*
27
* Portions Copyright IBM Corporation, 2001. All Rights Reserved.
28
*/
29
30
package java.math;
31
32
import static java.math.BigInteger.LONG_MASK;
33
import java.util.Arrays;
34
35
/**
36
* Immutable, arbitrary-precision signed decimal numbers. A
37
* {@code BigDecimal} consists of an arbitrary precision integer
38
* <i>unscaled value</i> and a 32-bit integer <i>scale</i>. If zero
39
* or positive, the scale is the number of digits to the right of the
40
* decimal point. If negative, the unscaled value of the number is
41
* multiplied by ten to the power of the negation of the scale. The
42
* value of the number represented by the {@code BigDecimal} is
43
* therefore <tt>(unscaledValue &times; 10<sup>-scale</sup>)</tt>.
44
*
45
* <p>The {@code BigDecimal} class provides operations for
46
* arithmetic, scale manipulation, rounding, comparison, hashing, and
47
* format conversion. The {@link #toString} method provides a
48
* canonical representation of a {@code BigDecimal}.
49
*
50
* <p>The {@code BigDecimal} class gives its user complete control
51
* over rounding behavior. If no rounding mode is specified and the
52
* exact result cannot be represented, an exception is thrown;
53
* otherwise, calculations can be carried out to a chosen precision
54
* and rounding mode by supplying an appropriate {@link MathContext}
55
* object to the operation. In either case, eight <em>rounding
56
* modes</em> are provided for the control of rounding. Using the
57
* integer fields in this class (such as {@link #ROUND_HALF_UP}) to
58
* represent rounding mode is largely obsolete; the enumeration values
59
* of the {@code RoundingMode} {@code enum}, (such as {@link
60
* RoundingMode#HALF_UP}) should be used instead.
61
*
62
* <p>When a {@code MathContext} object is supplied with a precision
63
* setting of 0 (for example, {@link MathContext#UNLIMITED}),
64
* arithmetic operations are exact, as are the arithmetic methods
65
* which take no {@code MathContext} object. (This is the only
66
* behavior that was supported in releases prior to 5.) As a
67
* corollary of computing the exact result, the rounding mode setting
68
* of a {@code MathContext} object with a precision setting of 0 is
69
* not used and thus irrelevant. In the case of divide, the exact
70
* quotient could have an infinitely long decimal expansion; for
71
* example, 1 divided by 3. If the quotient has a nonterminating
72
* decimal expansion and the operation is specified to return an exact
73
* result, an {@code ArithmeticException} is thrown. Otherwise, the
74
* exact result of the division is returned, as done for other
75
* operations.
76
*
77
* <p>When the precision setting is not 0, the rules of
78
* {@code BigDecimal} arithmetic are broadly compatible with selected
79
* modes of operation of the arithmetic defined in ANSI X3.274-1996
80
* and ANSI X3.274-1996/AM 1-2000 (section 7.4). Unlike those
81
* standards, {@code BigDecimal} includes many rounding modes, which
82
* were mandatory for division in {@code BigDecimal} releases prior
83
* to 5. Any conflicts between these ANSI standards and the
84
* {@code BigDecimal} specification are resolved in favor of
85
* {@code BigDecimal}.
86
*
87
* <p>Since the same numerical value can have different
88
* representations (with different scales), the rules of arithmetic
89
* and rounding must specify both the numerical result and the scale
90
* used in the result's representation.
91
*
92
*
93
* <p>In general the rounding modes and precision setting determine
94
* how operations return results with a limited number of digits when
95
* the exact result has more digits (perhaps infinitely many in the
96
* case of division) than the number of digits returned.
97
*
98
* First, the
99
* total number of digits to return is specified by the
100
* {@code MathContext}'s {@code precision} setting; this determines
101
* the result's <i>precision</i>. The digit count starts from the
102
* leftmost nonzero digit of the exact result. The rounding mode
103
* determines how any discarded trailing digits affect the returned
104
* result.
105
*
106
* <p>For all arithmetic operators , the operation is carried out as
107
* though an exact intermediate result were first calculated and then
108
* rounded to the number of digits specified by the precision setting
109
* (if necessary), using the selected rounding mode. If the exact
110
* result is not returned, some digit positions of the exact result
111
* are discarded. When rounding increases the magnitude of the
112
* returned result, it is possible for a new digit position to be
113
* created by a carry propagating to a leading {@literal "9"} digit.
114
* For example, rounding the value 999.9 to three digits rounding up
115
* would be numerically equal to one thousand, represented as
116
* 100&times;10<sup>1</sup>. In such cases, the new {@literal "1"} is
117
* the leading digit position of the returned result.
118
*
119
* <p>Besides a logical exact result, each arithmetic operation has a
120
* preferred scale for representing a result. The preferred
121
* scale for each operation is listed in the table below.
122
*
123
* <table border>
124
* <caption><b>Preferred Scales for Results of Arithmetic Operations
125
* </b></caption>
126
* <tr><th>Operation</th><th>Preferred Scale of Result</th></tr>
127
* <tr><td>Add</td><td>max(addend.scale(), augend.scale())</td>
128
* <tr><td>Subtract</td><td>max(minuend.scale(), subtrahend.scale())</td>
129
* <tr><td>Multiply</td><td>multiplier.scale() + multiplicand.scale()</td>
130
* <tr><td>Divide</td><td>dividend.scale() - divisor.scale()</td>
131
* </table>
132
*
133
* These scales are the ones used by the methods which return exact
134
* arithmetic results; except that an exact divide may have to use a
135
* larger scale since the exact result may have more digits. For
136
* example, {@code 1/32} is {@code 0.03125}.
137
*
138
* <p>Before rounding, the scale of the logical exact intermediate
139
* result is the preferred scale for that operation. If the exact
140
* numerical result cannot be represented in {@code precision}
141
* digits, rounding selects the set of digits to return and the scale
142
* of the result is reduced from the scale of the intermediate result
143
* to the least scale which can represent the {@code precision}
144
* digits actually returned. If the exact result can be represented
145
* with at most {@code precision} digits, the representation
146
* of the result with the scale closest to the preferred scale is
147
* returned. In particular, an exactly representable quotient may be
148
* represented in fewer than {@code precision} digits by removing
149
* trailing zeros and decreasing the scale. For example, rounding to
150
* three digits using the {@linkplain RoundingMode#FLOOR floor}
151
* rounding mode, <br>
152
*
153
* {@code 19/100 = 0.19 // integer=19, scale=2} <br>
154
*
155
* but<br>
156
*
157
* {@code 21/110 = 0.190 // integer=190, scale=3} <br>
158
*
159
* <p>Note that for add, subtract, and multiply, the reduction in
160
* scale will equal the number of digit positions of the exact result
161
* which are discarded. If the rounding causes a carry propagation to
162
* create a new high-order digit position, an additional digit of the
163
* result is discarded than when no new digit position is created.
164
*
165
* <p>Other methods may have slightly different rounding semantics.
166
* For example, the result of the {@code pow} method using the
167
* {@linkplain #pow(int, MathContext) specified algorithm} can
168
* occasionally differ from the rounded mathematical result by more
169
* than one unit in the last place, one <i>{@linkplain #ulp() ulp}</i>.
170
*
171
* <p>Two types of operations are provided for manipulating the scale
172
* of a {@code BigDecimal}: scaling/rounding operations and decimal
173
* point motion operations. Scaling/rounding operations ({@link
174
* #setScale setScale} and {@link #round round}) return a
175
* {@code BigDecimal} whose value is approximately (or exactly) equal
176
* to that of the operand, but whose scale or precision is the
177
* specified value; that is, they increase or decrease the precision
178
* of the stored number with minimal effect on its value. Decimal
179
* point motion operations ({@link #movePointLeft movePointLeft} and
180
* {@link #movePointRight movePointRight}) return a
181
* {@code BigDecimal} created from the operand by moving the decimal
182
* point a specified distance in the specified direction.
183
*
184
* <p>For the sake of brevity and clarity, pseudo-code is used
185
* throughout the descriptions of {@code BigDecimal} methods. The
186
* pseudo-code expression {@code (i + j)} is shorthand for "a
187
* {@code BigDecimal} whose value is that of the {@code BigDecimal}
188
* {@code i} added to that of the {@code BigDecimal}
189
* {@code j}." The pseudo-code expression {@code (i == j)} is
190
* shorthand for "{@code true} if and only if the
191
* {@code BigDecimal} {@code i} represents the same value as the
192
* {@code BigDecimal} {@code j}." Other pseudo-code expressions
193
* are interpreted similarly. Square brackets are used to represent
194
* the particular {@code BigInteger} and scale pair defining a
195
* {@code BigDecimal} value; for example [19, 2] is the
196
* {@code BigDecimal} numerically equal to 0.19 having a scale of 2.
197
*
198
* <p>Note: care should be exercised if {@code BigDecimal} objects
199
* are used as keys in a {@link java.util.SortedMap SortedMap} or
200
* elements in a {@link java.util.SortedSet SortedSet} since
201
* {@code BigDecimal}'s <i>natural ordering</i> is <i>inconsistent
202
* with equals</i>. See {@link Comparable}, {@link
203
* java.util.SortedMap} or {@link java.util.SortedSet} for more
204
* information.
205
*
206
* <p>All methods and constructors for this class throw
207
* {@code NullPointerException} when passed a {@code null} object
208
* reference for any input parameter.
209
*
210
* @see BigInteger
211
* @see MathContext
212
* @see RoundingMode
213
* @see java.util.SortedMap
214
* @see java.util.SortedSet
215
* @author Josh Bloch
216
* @author Mike Cowlishaw
217
* @author Joseph D. Darcy
218
* @author Sergey V. Kuksenko
219
*/
220
public class BigDecimal extends Number implements Comparable<BigDecimal> {
221
/**
222
* The unscaled value of this BigDecimal, as returned by {@link
223
* #unscaledValue}.
224
*
225
* @serial
226
* @see #unscaledValue
227
*/
228
private final BigInteger intVal;
229
230
/**
231
* The scale of this BigDecimal, as returned by {@link #scale}.
232
*
233
* @serial
234
* @see #scale
235
*/
236
private final int scale; // Note: this may have any value, so
237
// calculations must be done in longs
238
239
/**
240
* The number of decimal digits in this BigDecimal, or 0 if the
241
* number of digits are not known (lookaside information). If
242
* nonzero, the value is guaranteed correct. Use the precision()
243
* method to obtain and set the value if it might be 0. This
244
* field is mutable until set nonzero.
245
*
246
* @since 1.5
247
*/
248
private transient int precision;
249
250
/**
251
* Used to store the canonical string representation, if computed.
252
*/
253
private transient String stringCache;
254
255
/**
256
* Sentinel value for {@link #intCompact} indicating the
257
* significand information is only available from {@code intVal}.
258
*/
259
static final long INFLATED = Long.MIN_VALUE;
260
261
private static final BigInteger INFLATED_BIGINT = BigInteger.valueOf(INFLATED);
262
263
/**
264
* If the absolute value of the significand of this BigDecimal is
265
* less than or equal to {@code Long.MAX_VALUE}, the value can be
266
* compactly stored in this field and used in computations.
267
*/
268
private final transient long intCompact;
269
270
// All 18-digit base ten strings fit into a long; not all 19-digit
271
// strings will
272
private static final int MAX_COMPACT_DIGITS = 18;
273
274
/* Appease the serialization gods */
275
private static final long serialVersionUID = 6108874887143696463L;
276
277
private static final ThreadLocal<StringBuilderHelper>
278
threadLocalStringBuilderHelper = new ThreadLocal<StringBuilderHelper>() {
279
@Override
280
protected StringBuilderHelper initialValue() {
281
return new StringBuilderHelper();
282
}
283
};
284
285
// Cache of common small BigDecimal values.
286
private static final BigDecimal zeroThroughTen[] = {
287
new BigDecimal(BigInteger.ZERO, 0, 0, 1),
288
new BigDecimal(BigInteger.ONE, 1, 0, 1),
289
new BigDecimal(BigInteger.valueOf(2), 2, 0, 1),
290
new BigDecimal(BigInteger.valueOf(3), 3, 0, 1),
291
new BigDecimal(BigInteger.valueOf(4), 4, 0, 1),
292
new BigDecimal(BigInteger.valueOf(5), 5, 0, 1),
293
new BigDecimal(BigInteger.valueOf(6), 6, 0, 1),
294
new BigDecimal(BigInteger.valueOf(7), 7, 0, 1),
295
new BigDecimal(BigInteger.valueOf(8), 8, 0, 1),
296
new BigDecimal(BigInteger.valueOf(9), 9, 0, 1),
297
new BigDecimal(BigInteger.TEN, 10, 0, 2),
298
};
299
300
// Cache of zero scaled by 0 - 15
301
private static final BigDecimal[] ZERO_SCALED_BY = {
302
zeroThroughTen[0],
303
new BigDecimal(BigInteger.ZERO, 0, 1, 1),
304
new BigDecimal(BigInteger.ZERO, 0, 2, 1),
305
new BigDecimal(BigInteger.ZERO, 0, 3, 1),
306
new BigDecimal(BigInteger.ZERO, 0, 4, 1),
307
new BigDecimal(BigInteger.ZERO, 0, 5, 1),
308
new BigDecimal(BigInteger.ZERO, 0, 6, 1),
309
new BigDecimal(BigInteger.ZERO, 0, 7, 1),
310
new BigDecimal(BigInteger.ZERO, 0, 8, 1),
311
new BigDecimal(BigInteger.ZERO, 0, 9, 1),
312
new BigDecimal(BigInteger.ZERO, 0, 10, 1),
313
new BigDecimal(BigInteger.ZERO, 0, 11, 1),
314
new BigDecimal(BigInteger.ZERO, 0, 12, 1),
315
new BigDecimal(BigInteger.ZERO, 0, 13, 1),
316
new BigDecimal(BigInteger.ZERO, 0, 14, 1),
317
new BigDecimal(BigInteger.ZERO, 0, 15, 1),
318
};
319
320
// Half of Long.MIN_VALUE & Long.MAX_VALUE.
321
private static final long HALF_LONG_MAX_VALUE = Long.MAX_VALUE / 2;
322
private static final long HALF_LONG_MIN_VALUE = Long.MIN_VALUE / 2;
323
324
// Constants
325
/**
326
* The value 0, with a scale of 0.
327
*
328
* @since 1.5
329
*/
330
public static final BigDecimal ZERO =
331
zeroThroughTen[0];
332
333
/**
334
* The value 1, with a scale of 0.
335
*
336
* @since 1.5
337
*/
338
public static final BigDecimal ONE =
339
zeroThroughTen[1];
340
341
/**
342
* The value 10, with a scale of 0.
343
*
344
* @since 1.5
345
*/
346
public static final BigDecimal TEN =
347
zeroThroughTen[10];
348
349
// Constructors
350
351
/**
352
* Trusted package private constructor.
353
* Trusted simply means if val is INFLATED, intVal could not be null and
354
* if intVal is null, val could not be INFLATED.
355
*/
356
BigDecimal(BigInteger intVal, long val, int scale, int prec) {
357
this.scale = scale;
358
this.precision = prec;
359
this.intCompact = val;
360
this.intVal = intVal;
361
}
362
363
/**
364
* Translates a character array representation of a
365
* {@code BigDecimal} into a {@code BigDecimal}, accepting the
366
* same sequence of characters as the {@link #BigDecimal(String)}
367
* constructor, while allowing a sub-array to be specified.
368
*
369
* <p>Note that if the sequence of characters is already available
370
* within a character array, using this constructor is faster than
371
* converting the {@code char} array to string and using the
372
* {@code BigDecimal(String)} constructor .
373
*
374
* @param in {@code char} array that is the source of characters.
375
* @param offset first character in the array to inspect.
376
* @param len number of characters to consider.
377
* @throws NumberFormatException if {@code in} is not a valid
378
* representation of a {@code BigDecimal} or the defined subarray
379
* is not wholly within {@code in}.
380
* @since 1.5
381
*/
382
public BigDecimal(char[] in, int offset, int len) {
383
this(in,offset,len,MathContext.UNLIMITED);
384
}
385
386
/**
387
* Translates a character array representation of a
388
* {@code BigDecimal} into a {@code BigDecimal}, accepting the
389
* same sequence of characters as the {@link #BigDecimal(String)}
390
* constructor, while allowing a sub-array to be specified and
391
* with rounding according to the context settings.
392
*
393
* <p>Note that if the sequence of characters is already available
394
* within a character array, using this constructor is faster than
395
* converting the {@code char} array to string and using the
396
* {@code BigDecimal(String)} constructor .
397
*
398
* @param in {@code char} array that is the source of characters.
399
* @param offset first character in the array to inspect.
400
* @param len number of characters to consider..
401
* @param mc the context to use.
402
* @throws ArithmeticException if the result is inexact but the
403
* rounding mode is {@code UNNECESSARY}.
404
* @throws NumberFormatException if {@code in} is not a valid
405
* representation of a {@code BigDecimal} or the defined subarray
406
* is not wholly within {@code in}.
407
* @since 1.5
408
*/
409
public BigDecimal(char[] in, int offset, int len, MathContext mc) {
410
// protect against huge length, negative values, and integer overflow
411
if ((in.length | len | offset) < 0 || len > in.length - offset) {
412
throw new NumberFormatException
413
("Bad offset or len arguments for char[] input.");
414
}
415
416
// This is the primary string to BigDecimal constructor; all
417
// incoming strings end up here; it uses explicit (inline)
418
// parsing for speed and generates at most one intermediate
419
// (temporary) object (a char[] array) for non-compact case.
420
421
// Use locals for all fields values until completion
422
int prec = 0; // record precision value
423
int scl = 0; // record scale value
424
long rs = 0; // the compact value in long
425
BigInteger rb = null; // the inflated value in BigInteger
426
// use array bounds checking to handle too-long, len == 0,
427
// bad offset, etc.
428
try {
429
// handle the sign
430
boolean isneg = false; // assume positive
431
if (in[offset] == '-') {
432
isneg = true; // leading minus means negative
433
offset++;
434
len--;
435
} else if (in[offset] == '+') { // leading + allowed
436
offset++;
437
len--;
438
}
439
440
// should now be at numeric part of the significand
441
boolean dot = false; // true when there is a '.'
442
long exp = 0; // exponent
443
char c; // current character
444
boolean isCompact = (len <= MAX_COMPACT_DIGITS);
445
// integer significand array & idx is the index to it. The array
446
// is ONLY used when we can't use a compact representation.
447
int idx = 0;
448
if (isCompact) {
449
// First compact case, we need not to preserve the character
450
// and we can just compute the value in place.
451
for (; len > 0; offset++, len--) {
452
c = in[offset];
453
if ((c == '0')) { // have zero
454
if (prec == 0)
455
prec = 1;
456
else if (rs != 0) {
457
rs *= 10;
458
++prec;
459
} // else digit is a redundant leading zero
460
if (dot)
461
++scl;
462
} else if ((c >= '1' && c <= '9')) { // have digit
463
int digit = c - '0';
464
if (prec != 1 || rs != 0)
465
++prec; // prec unchanged if preceded by 0s
466
rs = rs * 10 + digit;
467
if (dot)
468
++scl;
469
} else if (c == '.') { // have dot
470
// have dot
471
if (dot) // two dots
472
throw new NumberFormatException();
473
dot = true;
474
} else if (Character.isDigit(c)) { // slow path
475
int digit = Character.digit(c, 10);
476
if (digit == 0) {
477
if (prec == 0)
478
prec = 1;
479
else if (rs != 0) {
480
rs *= 10;
481
++prec;
482
} // else digit is a redundant leading zero
483
} else {
484
if (prec != 1 || rs != 0)
485
++prec; // prec unchanged if preceded by 0s
486
rs = rs * 10 + digit;
487
}
488
if (dot)
489
++scl;
490
} else if ((c == 'e') || (c == 'E')) {
491
exp = parseExp(in, offset, len);
492
// Next test is required for backwards compatibility
493
if ((int) exp != exp) // overflow
494
throw new NumberFormatException();
495
break; // [saves a test]
496
} else {
497
throw new NumberFormatException();
498
}
499
}
500
if (prec == 0) // no digits found
501
throw new NumberFormatException();
502
// Adjust scale if exp is not zero.
503
if (exp != 0) { // had significant exponent
504
scl = adjustScale(scl, exp);
505
}
506
rs = isneg ? -rs : rs;
507
int mcp = mc.precision;
508
int drop = prec - mcp; // prec has range [1, MAX_INT], mcp has range [0, MAX_INT];
509
// therefore, this subtract cannot overflow
510
if (mcp > 0 && drop > 0) { // do rounding
511
while (drop > 0) {
512
scl = checkScaleNonZero((long) scl - drop);
513
rs = divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
514
prec = longDigitLength(rs);
515
drop = prec - mcp;
516
}
517
}
518
} else {
519
char coeff[] = new char[len];
520
for (; len > 0; offset++, len--) {
521
c = in[offset];
522
// have digit
523
if ((c >= '0' && c <= '9') || Character.isDigit(c)) {
524
// First compact case, we need not to preserve the character
525
// and we can just compute the value in place.
526
if (c == '0' || Character.digit(c, 10) == 0) {
527
if (prec == 0) {
528
coeff[idx] = c;
529
prec = 1;
530
} else if (idx != 0) {
531
coeff[idx++] = c;
532
++prec;
533
} // else c must be a redundant leading zero
534
} else {
535
if (prec != 1 || idx != 0)
536
++prec; // prec unchanged if preceded by 0s
537
coeff[idx++] = c;
538
}
539
if (dot)
540
++scl;
541
continue;
542
}
543
// have dot
544
if (c == '.') {
545
// have dot
546
if (dot) // two dots
547
throw new NumberFormatException();
548
dot = true;
549
continue;
550
}
551
// exponent expected
552
if ((c != 'e') && (c != 'E'))
553
throw new NumberFormatException();
554
exp = parseExp(in, offset, len);
555
// Next test is required for backwards compatibility
556
if ((int) exp != exp) // overflow
557
throw new NumberFormatException();
558
break; // [saves a test]
559
}
560
// here when no characters left
561
if (prec == 0) // no digits found
562
throw new NumberFormatException();
563
// Adjust scale if exp is not zero.
564
if (exp != 0) { // had significant exponent
565
scl = adjustScale(scl, exp);
566
}
567
// Remove leading zeros from precision (digits count)
568
rb = new BigInteger(coeff, isneg ? -1 : 1, prec);
569
rs = compactValFor(rb);
570
int mcp = mc.precision;
571
if (mcp > 0 && (prec > mcp)) {
572
if (rs == INFLATED) {
573
int drop = prec - mcp;
574
while (drop > 0) {
575
scl = checkScaleNonZero((long) scl - drop);
576
rb = divideAndRoundByTenPow(rb, drop, mc.roundingMode.oldMode);
577
rs = compactValFor(rb);
578
if (rs != INFLATED) {
579
prec = longDigitLength(rs);
580
break;
581
}
582
prec = bigDigitLength(rb);
583
drop = prec - mcp;
584
}
585
}
586
if (rs != INFLATED) {
587
int drop = prec - mcp;
588
while (drop > 0) {
589
scl = checkScaleNonZero((long) scl - drop);
590
rs = divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
591
prec = longDigitLength(rs);
592
drop = prec - mcp;
593
}
594
rb = null;
595
}
596
}
597
}
598
} catch (ArrayIndexOutOfBoundsException e) {
599
throw new NumberFormatException();
600
} catch (NegativeArraySizeException e) {
601
throw new NumberFormatException();
602
}
603
this.scale = scl;
604
this.precision = prec;
605
this.intCompact = rs;
606
this.intVal = rb;
607
}
608
609
private int adjustScale(int scl, long exp) {
610
long adjustedScale = scl - exp;
611
if (adjustedScale > Integer.MAX_VALUE || adjustedScale < Integer.MIN_VALUE)
612
throw new NumberFormatException("Scale out of range.");
613
scl = (int) adjustedScale;
614
return scl;
615
}
616
617
/*
618
* parse exponent
619
*/
620
private static long parseExp(char[] in, int offset, int len){
621
long exp = 0;
622
offset++;
623
char c = in[offset];
624
len--;
625
boolean negexp = (c == '-');
626
// optional sign
627
if (negexp || c == '+') {
628
offset++;
629
c = in[offset];
630
len--;
631
}
632
if (len <= 0) // no exponent digits
633
throw new NumberFormatException();
634
// skip leading zeros in the exponent
635
while (len > 10 && (c=='0' || (Character.digit(c, 10) == 0))) {
636
offset++;
637
c = in[offset];
638
len--;
639
}
640
if (len > 10) // too many nonzero exponent digits
641
throw new NumberFormatException();
642
// c now holds first digit of exponent
643
for (;; len--) {
644
int v;
645
if (c >= '0' && c <= '9') {
646
v = c - '0';
647
} else {
648
v = Character.digit(c, 10);
649
if (v < 0) // not a digit
650
throw new NumberFormatException();
651
}
652
exp = exp * 10 + v;
653
if (len == 1)
654
break; // that was final character
655
offset++;
656
c = in[offset];
657
}
658
if (negexp) // apply sign
659
exp = -exp;
660
return exp;
661
}
662
663
/**
664
* Translates a character array representation of a
665
* {@code BigDecimal} into a {@code BigDecimal}, accepting the
666
* same sequence of characters as the {@link #BigDecimal(String)}
667
* constructor.
668
*
669
* <p>Note that if the sequence of characters is already available
670
* as a character array, using this constructor is faster than
671
* converting the {@code char} array to string and using the
672
* {@code BigDecimal(String)} constructor .
673
*
674
* @param in {@code char} array that is the source of characters.
675
* @throws NumberFormatException if {@code in} is not a valid
676
* representation of a {@code BigDecimal}.
677
* @since 1.5
678
*/
679
public BigDecimal(char[] in) {
680
this(in, 0, in.length);
681
}
682
683
/**
684
* Translates a character array representation of a
685
* {@code BigDecimal} into a {@code BigDecimal}, accepting the
686
* same sequence of characters as the {@link #BigDecimal(String)}
687
* constructor and with rounding according to the context
688
* settings.
689
*
690
* <p>Note that if the sequence of characters is already available
691
* as a character array, using this constructor is faster than
692
* converting the {@code char} array to string and using the
693
* {@code BigDecimal(String)} constructor .
694
*
695
* @param in {@code char} array that is the source of characters.
696
* @param mc the context to use.
697
* @throws ArithmeticException if the result is inexact but the
698
* rounding mode is {@code UNNECESSARY}.
699
* @throws NumberFormatException if {@code in} is not a valid
700
* representation of a {@code BigDecimal}.
701
* @since 1.5
702
*/
703
public BigDecimal(char[] in, MathContext mc) {
704
this(in, 0, in.length, mc);
705
}
706
707
/**
708
* Translates the string representation of a {@code BigDecimal}
709
* into a {@code BigDecimal}. The string representation consists
710
* of an optional sign, {@code '+'} (<tt> '&#92;u002B'</tt>) or
711
* {@code '-'} (<tt>'&#92;u002D'</tt>), followed by a sequence of
712
* zero or more decimal digits ("the integer"), optionally
713
* followed by a fraction, optionally followed by an exponent.
714
*
715
* <p>The fraction consists of a decimal point followed by zero
716
* or more decimal digits. The string must contain at least one
717
* digit in either the integer or the fraction. The number formed
718
* by the sign, the integer and the fraction is referred to as the
719
* <i>significand</i>.
720
*
721
* <p>The exponent consists of the character {@code 'e'}
722
* (<tt>'&#92;u0065'</tt>) or {@code 'E'} (<tt>'&#92;u0045'</tt>)
723
* followed by one or more decimal digits. The value of the
724
* exponent must lie between -{@link Integer#MAX_VALUE} ({@link
725
* Integer#MIN_VALUE}+1) and {@link Integer#MAX_VALUE}, inclusive.
726
*
727
* <p>More formally, the strings this constructor accepts are
728
* described by the following grammar:
729
* <blockquote>
730
* <dl>
731
* <dt><i>BigDecimalString:</i>
732
* <dd><i>Sign<sub>opt</sub> Significand Exponent<sub>opt</sub></i>
733
* <dt><i>Sign:</i>
734
* <dd>{@code +}
735
* <dd>{@code -}
736
* <dt><i>Significand:</i>
737
* <dd><i>IntegerPart</i> {@code .} <i>FractionPart<sub>opt</sub></i>
738
* <dd>{@code .} <i>FractionPart</i>
739
* <dd><i>IntegerPart</i>
740
* <dt><i>IntegerPart:</i>
741
* <dd><i>Digits</i>
742
* <dt><i>FractionPart:</i>
743
* <dd><i>Digits</i>
744
* <dt><i>Exponent:</i>
745
* <dd><i>ExponentIndicator SignedInteger</i>
746
* <dt><i>ExponentIndicator:</i>
747
* <dd>{@code e}
748
* <dd>{@code E}
749
* <dt><i>SignedInteger:</i>
750
* <dd><i>Sign<sub>opt</sub> Digits</i>
751
* <dt><i>Digits:</i>
752
* <dd><i>Digit</i>
753
* <dd><i>Digits Digit</i>
754
* <dt><i>Digit:</i>
755
* <dd>any character for which {@link Character#isDigit}
756
* returns {@code true}, including 0, 1, 2 ...
757
* </dl>
758
* </blockquote>
759
*
760
* <p>The scale of the returned {@code BigDecimal} will be the
761
* number of digits in the fraction, or zero if the string
762
* contains no decimal point, subject to adjustment for any
763
* exponent; if the string contains an exponent, the exponent is
764
* subtracted from the scale. The value of the resulting scale
765
* must lie between {@code Integer.MIN_VALUE} and
766
* {@code Integer.MAX_VALUE}, inclusive.
767
*
768
* <p>The character-to-digit mapping is provided by {@link
769
* java.lang.Character#digit} set to convert to radix 10. The
770
* String may not contain any extraneous characters (whitespace,
771
* for example).
772
*
773
* <p><b>Examples:</b><br>
774
* The value of the returned {@code BigDecimal} is equal to
775
* <i>significand</i> &times; 10<sup>&nbsp;<i>exponent</i></sup>.
776
* For each string on the left, the resulting representation
777
* [{@code BigInteger}, {@code scale}] is shown on the right.
778
* <pre>
779
* "0" [0,0]
780
* "0.00" [0,2]
781
* "123" [123,0]
782
* "-123" [-123,0]
783
* "1.23E3" [123,-1]
784
* "1.23E+3" [123,-1]
785
* "12.3E+7" [123,-6]
786
* "12.0" [120,1]
787
* "12.3" [123,1]
788
* "0.00123" [123,5]
789
* "-1.23E-12" [-123,14]
790
* "1234.5E-4" [12345,5]
791
* "0E+7" [0,-7]
792
* "-0" [0,0]
793
* </pre>
794
*
795
* <p>Note: For values other than {@code float} and
796
* {@code double} NaN and &plusmn;Infinity, this constructor is
797
* compatible with the values returned by {@link Float#toString}
798
* and {@link Double#toString}. This is generally the preferred
799
* way to convert a {@code float} or {@code double} into a
800
* BigDecimal, as it doesn't suffer from the unpredictability of
801
* the {@link #BigDecimal(double)} constructor.
802
*
803
* @param val String representation of {@code BigDecimal}.
804
*
805
* @throws NumberFormatException if {@code val} is not a valid
806
* representation of a {@code BigDecimal}.
807
*/
808
public BigDecimal(String val) {
809
this(val.toCharArray(), 0, val.length());
810
}
811
812
/**
813
* Translates the string representation of a {@code BigDecimal}
814
* into a {@code BigDecimal}, accepting the same strings as the
815
* {@link #BigDecimal(String)} constructor, with rounding
816
* according to the context settings.
817
*
818
* @param val string representation of a {@code BigDecimal}.
819
* @param mc the context to use.
820
* @throws ArithmeticException if the result is inexact but the
821
* rounding mode is {@code UNNECESSARY}.
822
* @throws NumberFormatException if {@code val} is not a valid
823
* representation of a BigDecimal.
824
* @since 1.5
825
*/
826
public BigDecimal(String val, MathContext mc) {
827
this(val.toCharArray(), 0, val.length(), mc);
828
}
829
830
/**
831
* Translates a {@code double} into a {@code BigDecimal} which
832
* is the exact decimal representation of the {@code double}'s
833
* binary floating-point value. The scale of the returned
834
* {@code BigDecimal} is the smallest value such that
835
* <tt>(10<sup>scale</sup> &times; val)</tt> is an integer.
836
* <p>
837
* <b>Notes:</b>
838
* <ol>
839
* <li>
840
* The results of this constructor can be somewhat unpredictable.
841
* One might assume that writing {@code new BigDecimal(0.1)} in
842
* Java creates a {@code BigDecimal} which is exactly equal to
843
* 0.1 (an unscaled value of 1, with a scale of 1), but it is
844
* actually equal to
845
* 0.1000000000000000055511151231257827021181583404541015625.
846
* This is because 0.1 cannot be represented exactly as a
847
* {@code double} (or, for that matter, as a binary fraction of
848
* any finite length). Thus, the value that is being passed
849
* <i>in</i> to the constructor is not exactly equal to 0.1,
850
* appearances notwithstanding.
851
*
852
* <li>
853
* The {@code String} constructor, on the other hand, is
854
* perfectly predictable: writing {@code new BigDecimal("0.1")}
855
* creates a {@code BigDecimal} which is <i>exactly</i> equal to
856
* 0.1, as one would expect. Therefore, it is generally
857
* recommended that the {@linkplain #BigDecimal(String)
858
* <tt>String</tt> constructor} be used in preference to this one.
859
*
860
* <li>
861
* When a {@code double} must be used as a source for a
862
* {@code BigDecimal}, note that this constructor provides an
863
* exact conversion; it does not give the same result as
864
* converting the {@code double} to a {@code String} using the
865
* {@link Double#toString(double)} method and then using the
866
* {@link #BigDecimal(String)} constructor. To get that result,
867
* use the {@code static} {@link #valueOf(double)} method.
868
* </ol>
869
*
870
* @param val {@code double} value to be converted to
871
* {@code BigDecimal}.
872
* @throws NumberFormatException if {@code val} is infinite or NaN.
873
*/
874
public BigDecimal(double val) {
875
this(val,MathContext.UNLIMITED);
876
}
877
878
/**
879
* Translates a {@code double} into a {@code BigDecimal}, with
880
* rounding according to the context settings. The scale of the
881
* {@code BigDecimal} is the smallest value such that
882
* <tt>(10<sup>scale</sup> &times; val)</tt> is an integer.
883
*
884
* <p>The results of this constructor can be somewhat unpredictable
885
* and its use is generally not recommended; see the notes under
886
* the {@link #BigDecimal(double)} constructor.
887
*
888
* @param val {@code double} value to be converted to
889
* {@code BigDecimal}.
890
* @param mc the context to use.
891
* @throws ArithmeticException if the result is inexact but the
892
* RoundingMode is UNNECESSARY.
893
* @throws NumberFormatException if {@code val} is infinite or NaN.
894
* @since 1.5
895
*/
896
public BigDecimal(double val, MathContext mc) {
897
if (Double.isInfinite(val) || Double.isNaN(val))
898
throw new NumberFormatException("Infinite or NaN");
899
// Translate the double into sign, exponent and significand, according
900
// to the formulae in JLS, Section 20.10.22.
901
long valBits = Double.doubleToLongBits(val);
902
int sign = ((valBits >> 63) == 0 ? 1 : -1);
903
int exponent = (int) ((valBits >> 52) & 0x7ffL);
904
long significand = (exponent == 0
905
? (valBits & ((1L << 52) - 1)) << 1
906
: (valBits & ((1L << 52) - 1)) | (1L << 52));
907
exponent -= 1075;
908
// At this point, val == sign * significand * 2**exponent.
909
910
/*
911
* Special case zero to supress nonterminating normalization and bogus
912
* scale calculation.
913
*/
914
if (significand == 0) {
915
this.intVal = BigInteger.ZERO;
916
this.scale = 0;
917
this.intCompact = 0;
918
this.precision = 1;
919
return;
920
}
921
// Normalize
922
while ((significand & 1) == 0) { // i.e., significand is even
923
significand >>= 1;
924
exponent++;
925
}
926
int scale = 0;
927
// Calculate intVal and scale
928
BigInteger intVal;
929
long compactVal = sign * significand;
930
if (exponent == 0) {
931
intVal = (compactVal == INFLATED) ? INFLATED_BIGINT : null;
932
} else {
933
if (exponent < 0) {
934
intVal = BigInteger.valueOf(5).pow(-exponent).multiply(compactVal);
935
scale = -exponent;
936
} else { // (exponent > 0)
937
intVal = BigInteger.valueOf(2).pow(exponent).multiply(compactVal);
938
}
939
compactVal = compactValFor(intVal);
940
}
941
int prec = 0;
942
int mcp = mc.precision;
943
if (mcp > 0) { // do rounding
944
int mode = mc.roundingMode.oldMode;
945
int drop;
946
if (compactVal == INFLATED) {
947
prec = bigDigitLength(intVal);
948
drop = prec - mcp;
949
while (drop > 0) {
950
scale = checkScaleNonZero((long) scale - drop);
951
intVal = divideAndRoundByTenPow(intVal, drop, mode);
952
compactVal = compactValFor(intVal);
953
if (compactVal != INFLATED) {
954
break;
955
}
956
prec = bigDigitLength(intVal);
957
drop = prec - mcp;
958
}
959
}
960
if (compactVal != INFLATED) {
961
prec = longDigitLength(compactVal);
962
drop = prec - mcp;
963
while (drop > 0) {
964
scale = checkScaleNonZero((long) scale - drop);
965
compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
966
prec = longDigitLength(compactVal);
967
drop = prec - mcp;
968
}
969
intVal = null;
970
}
971
}
972
this.intVal = intVal;
973
this.intCompact = compactVal;
974
this.scale = scale;
975
this.precision = prec;
976
}
977
978
/**
979
* Translates a {@code BigInteger} into a {@code BigDecimal}.
980
* The scale of the {@code BigDecimal} is zero.
981
*
982
* @param val {@code BigInteger} value to be converted to
983
* {@code BigDecimal}.
984
*/
985
public BigDecimal(BigInteger val) {
986
scale = 0;
987
intVal = val;
988
intCompact = compactValFor(val);
989
}
990
991
/**
992
* Translates a {@code BigInteger} into a {@code BigDecimal}
993
* rounding according to the context settings. The scale of the
994
* {@code BigDecimal} is zero.
995
*
996
* @param val {@code BigInteger} value to be converted to
997
* {@code BigDecimal}.
998
* @param mc the context to use.
999
* @throws ArithmeticException if the result is inexact but the
1000
* rounding mode is {@code UNNECESSARY}.
1001
* @since 1.5
1002
*/
1003
public BigDecimal(BigInteger val, MathContext mc) {
1004
this(val,0,mc);
1005
}
1006
1007
/**
1008
* Translates a {@code BigInteger} unscaled value and an
1009
* {@code int} scale into a {@code BigDecimal}. The value of
1010
* the {@code BigDecimal} is
1011
* <tt>(unscaledVal &times; 10<sup>-scale</sup>)</tt>.
1012
*
1013
* @param unscaledVal unscaled value of the {@code BigDecimal}.
1014
* @param scale scale of the {@code BigDecimal}.
1015
*/
1016
public BigDecimal(BigInteger unscaledVal, int scale) {
1017
// Negative scales are now allowed
1018
this.intVal = unscaledVal;
1019
this.intCompact = compactValFor(unscaledVal);
1020
this.scale = scale;
1021
}
1022
1023
/**
1024
* Translates a {@code BigInteger} unscaled value and an
1025
* {@code int} scale into a {@code BigDecimal}, with rounding
1026
* according to the context settings. The value of the
1027
* {@code BigDecimal} is <tt>(unscaledVal &times;
1028
* 10<sup>-scale</sup>)</tt>, rounded according to the
1029
* {@code precision} and rounding mode settings.
1030
*
1031
* @param unscaledVal unscaled value of the {@code BigDecimal}.
1032
* @param scale scale of the {@code BigDecimal}.
1033
* @param mc the context to use.
1034
* @throws ArithmeticException if the result is inexact but the
1035
* rounding mode is {@code UNNECESSARY}.
1036
* @since 1.5
1037
*/
1038
public BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) {
1039
long compactVal = compactValFor(unscaledVal);
1040
int mcp = mc.precision;
1041
int prec = 0;
1042
if (mcp > 0) { // do rounding
1043
int mode = mc.roundingMode.oldMode;
1044
if (compactVal == INFLATED) {
1045
prec = bigDigitLength(unscaledVal);
1046
int drop = prec - mcp;
1047
while (drop > 0) {
1048
scale = checkScaleNonZero((long) scale - drop);
1049
unscaledVal = divideAndRoundByTenPow(unscaledVal, drop, mode);
1050
compactVal = compactValFor(unscaledVal);
1051
if (compactVal != INFLATED) {
1052
break;
1053
}
1054
prec = bigDigitLength(unscaledVal);
1055
drop = prec - mcp;
1056
}
1057
}
1058
if (compactVal != INFLATED) {
1059
prec = longDigitLength(compactVal);
1060
int drop = prec - mcp; // drop can't be more than 18
1061
while (drop > 0) {
1062
scale = checkScaleNonZero((long) scale - drop);
1063
compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mode);
1064
prec = longDigitLength(compactVal);
1065
drop = prec - mcp;
1066
}
1067
unscaledVal = null;
1068
}
1069
}
1070
this.intVal = unscaledVal;
1071
this.intCompact = compactVal;
1072
this.scale = scale;
1073
this.precision = prec;
1074
}
1075
1076
/**
1077
* Translates an {@code int} into a {@code BigDecimal}. The
1078
* scale of the {@code BigDecimal} is zero.
1079
*
1080
* @param val {@code int} value to be converted to
1081
* {@code BigDecimal}.
1082
* @since 1.5
1083
*/
1084
public BigDecimal(int val) {
1085
this.intCompact = val;
1086
this.scale = 0;
1087
this.intVal = null;
1088
}
1089
1090
/**
1091
* Translates an {@code int} into a {@code BigDecimal}, with
1092
* rounding according to the context settings. The scale of the
1093
* {@code BigDecimal}, before any rounding, is zero.
1094
*
1095
* @param val {@code int} value to be converted to {@code BigDecimal}.
1096
* @param mc the context to use.
1097
* @throws ArithmeticException if the result is inexact but the
1098
* rounding mode is {@code UNNECESSARY}.
1099
* @since 1.5
1100
*/
1101
public BigDecimal(int val, MathContext mc) {
1102
int mcp = mc.precision;
1103
long compactVal = val;
1104
int scale = 0;
1105
int prec = 0;
1106
if (mcp > 0) { // do rounding
1107
prec = longDigitLength(compactVal);
1108
int drop = prec - mcp; // drop can't be more than 18
1109
while (drop > 0) {
1110
scale = checkScaleNonZero((long) scale - drop);
1111
compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
1112
prec = longDigitLength(compactVal);
1113
drop = prec - mcp;
1114
}
1115
}
1116
this.intVal = null;
1117
this.intCompact = compactVal;
1118
this.scale = scale;
1119
this.precision = prec;
1120
}
1121
1122
/**
1123
* Translates a {@code long} into a {@code BigDecimal}. The
1124
* scale of the {@code BigDecimal} is zero.
1125
*
1126
* @param val {@code long} value to be converted to {@code BigDecimal}.
1127
* @since 1.5
1128
*/
1129
public BigDecimal(long val) {
1130
this.intCompact = val;
1131
this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
1132
this.scale = 0;
1133
}
1134
1135
/**
1136
* Translates a {@code long} into a {@code BigDecimal}, with
1137
* rounding according to the context settings. The scale of the
1138
* {@code BigDecimal}, before any rounding, is zero.
1139
*
1140
* @param val {@code long} value to be converted to {@code BigDecimal}.
1141
* @param mc the context to use.
1142
* @throws ArithmeticException if the result is inexact but the
1143
* rounding mode is {@code UNNECESSARY}.
1144
* @since 1.5
1145
*/
1146
public BigDecimal(long val, MathContext mc) {
1147
int mcp = mc.precision;
1148
int mode = mc.roundingMode.oldMode;
1149
int prec = 0;
1150
int scale = 0;
1151
BigInteger intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
1152
if (mcp > 0) { // do rounding
1153
if (val == INFLATED) {
1154
prec = 19;
1155
int drop = prec - mcp;
1156
while (drop > 0) {
1157
scale = checkScaleNonZero((long) scale - drop);
1158
intVal = divideAndRoundByTenPow(intVal, drop, mode);
1159
val = compactValFor(intVal);
1160
if (val != INFLATED) {
1161
break;
1162
}
1163
prec = bigDigitLength(intVal);
1164
drop = prec - mcp;
1165
}
1166
}
1167
if (val != INFLATED) {
1168
prec = longDigitLength(val);
1169
int drop = prec - mcp;
1170
while (drop > 0) {
1171
scale = checkScaleNonZero((long) scale - drop);
1172
val = divideAndRound(val, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
1173
prec = longDigitLength(val);
1174
drop = prec - mcp;
1175
}
1176
intVal = null;
1177
}
1178
}
1179
this.intVal = intVal;
1180
this.intCompact = val;
1181
this.scale = scale;
1182
this.precision = prec;
1183
}
1184
1185
// Static Factory Methods
1186
1187
/**
1188
* Translates a {@code long} unscaled value and an
1189
* {@code int} scale into a {@code BigDecimal}. This
1190
* {@literal "static factory method"} is provided in preference to
1191
* a ({@code long}, {@code int}) constructor because it
1192
* allows for reuse of frequently used {@code BigDecimal} values..
1193
*
1194
* @param unscaledVal unscaled value of the {@code BigDecimal}.
1195
* @param scale scale of the {@code BigDecimal}.
1196
* @return a {@code BigDecimal} whose value is
1197
* <tt>(unscaledVal &times; 10<sup>-scale</sup>)</tt>.
1198
*/
1199
public static BigDecimal valueOf(long unscaledVal, int scale) {
1200
if (scale == 0)
1201
return valueOf(unscaledVal);
1202
else if (unscaledVal == 0) {
1203
return zeroValueOf(scale);
1204
}
1205
return new BigDecimal(unscaledVal == INFLATED ?
1206
INFLATED_BIGINT : null,
1207
unscaledVal, scale, 0);
1208
}
1209
1210
/**
1211
* Translates a {@code long} value into a {@code BigDecimal}
1212
* with a scale of zero. This {@literal "static factory method"}
1213
* is provided in preference to a ({@code long}) constructor
1214
* because it allows for reuse of frequently used
1215
* {@code BigDecimal} values.
1216
*
1217
* @param val value of the {@code BigDecimal}.
1218
* @return a {@code BigDecimal} whose value is {@code val}.
1219
*/
1220
public static BigDecimal valueOf(long val) {
1221
if (val >= 0 && val < zeroThroughTen.length)
1222
return zeroThroughTen[(int)val];
1223
else if (val != INFLATED)
1224
return new BigDecimal(null, val, 0, 0);
1225
return new BigDecimal(INFLATED_BIGINT, val, 0, 0);
1226
}
1227
1228
static BigDecimal valueOf(long unscaledVal, int scale, int prec) {
1229
if (scale == 0 && unscaledVal >= 0 && unscaledVal < zeroThroughTen.length) {
1230
return zeroThroughTen[(int) unscaledVal];
1231
} else if (unscaledVal == 0) {
1232
return zeroValueOf(scale);
1233
}
1234
return new BigDecimal(unscaledVal == INFLATED ? INFLATED_BIGINT : null,
1235
unscaledVal, scale, prec);
1236
}
1237
1238
static BigDecimal valueOf(BigInteger intVal, int scale, int prec) {
1239
long val = compactValFor(intVal);
1240
if (val == 0) {
1241
return zeroValueOf(scale);
1242
} else if (scale == 0 && val >= 0 && val < zeroThroughTen.length) {
1243
return zeroThroughTen[(int) val];
1244
}
1245
return new BigDecimal(intVal, val, scale, prec);
1246
}
1247
1248
static BigDecimal zeroValueOf(int scale) {
1249
if (scale >= 0 && scale < ZERO_SCALED_BY.length)
1250
return ZERO_SCALED_BY[scale];
1251
else
1252
return new BigDecimal(BigInteger.ZERO, 0, scale, 1);
1253
}
1254
1255
/**
1256
* Translates a {@code double} into a {@code BigDecimal}, using
1257
* the {@code double}'s canonical string representation provided
1258
* by the {@link Double#toString(double)} method.
1259
*
1260
* <p><b>Note:</b> This is generally the preferred way to convert
1261
* a {@code double} (or {@code float}) into a
1262
* {@code BigDecimal}, as the value returned is equal to that
1263
* resulting from constructing a {@code BigDecimal} from the
1264
* result of using {@link Double#toString(double)}.
1265
*
1266
* @param val {@code double} to convert to a {@code BigDecimal}.
1267
* @return a {@code BigDecimal} whose value is equal to or approximately
1268
* equal to the value of {@code val}.
1269
* @throws NumberFormatException if {@code val} is infinite or NaN.
1270
* @since 1.5
1271
*/
1272
public static BigDecimal valueOf(double val) {
1273
// Reminder: a zero double returns '0.0', so we cannot fastpath
1274
// to use the constant ZERO. This might be important enough to
1275
// justify a factory approach, a cache, or a few private
1276
// constants, later.
1277
return new BigDecimal(Double.toString(val));
1278
}
1279
1280
// Arithmetic Operations
1281
/**
1282
* Returns a {@code BigDecimal} whose value is {@code (this +
1283
* augend)}, and whose scale is {@code max(this.scale(),
1284
* augend.scale())}.
1285
*
1286
* @param augend value to be added to this {@code BigDecimal}.
1287
* @return {@code this + augend}
1288
*/
1289
public BigDecimal add(BigDecimal augend) {
1290
if (this.intCompact != INFLATED) {
1291
if ((augend.intCompact != INFLATED)) {
1292
return add(this.intCompact, this.scale, augend.intCompact, augend.scale);
1293
} else {
1294
return add(this.intCompact, this.scale, augend.intVal, augend.scale);
1295
}
1296
} else {
1297
if ((augend.intCompact != INFLATED)) {
1298
return add(augend.intCompact, augend.scale, this.intVal, this.scale);
1299
} else {
1300
return add(this.intVal, this.scale, augend.intVal, augend.scale);
1301
}
1302
}
1303
}
1304
1305
/**
1306
* Returns a {@code BigDecimal} whose value is {@code (this + augend)},
1307
* with rounding according to the context settings.
1308
*
1309
* If either number is zero and the precision setting is nonzero then
1310
* the other number, rounded if necessary, is used as the result.
1311
*
1312
* @param augend value to be added to this {@code BigDecimal}.
1313
* @param mc the context to use.
1314
* @return {@code this + augend}, rounded as necessary.
1315
* @throws ArithmeticException if the result is inexact but the
1316
* rounding mode is {@code UNNECESSARY}.
1317
* @since 1.5
1318
*/
1319
public BigDecimal add(BigDecimal augend, MathContext mc) {
1320
if (mc.precision == 0)
1321
return add(augend);
1322
BigDecimal lhs = this;
1323
1324
// If either number is zero then the other number, rounded and
1325
// scaled if necessary, is used as the result.
1326
{
1327
boolean lhsIsZero = lhs.signum() == 0;
1328
boolean augendIsZero = augend.signum() == 0;
1329
1330
if (lhsIsZero || augendIsZero) {
1331
int preferredScale = Math.max(lhs.scale(), augend.scale());
1332
BigDecimal result;
1333
1334
if (lhsIsZero && augendIsZero)
1335
return zeroValueOf(preferredScale);
1336
result = lhsIsZero ? doRound(augend, mc) : doRound(lhs, mc);
1337
1338
if (result.scale() == preferredScale)
1339
return result;
1340
else if (result.scale() > preferredScale) {
1341
return stripZerosToMatchScale(result.intVal, result.intCompact, result.scale, preferredScale);
1342
} else { // result.scale < preferredScale
1343
int precisionDiff = mc.precision - result.precision();
1344
int scaleDiff = preferredScale - result.scale();
1345
1346
if (precisionDiff >= scaleDiff)
1347
return result.setScale(preferredScale); // can achieve target scale
1348
else
1349
return result.setScale(result.scale() + precisionDiff);
1350
}
1351
}
1352
}
1353
1354
long padding = (long) lhs.scale - augend.scale;
1355
if (padding != 0) { // scales differ; alignment needed
1356
BigDecimal arg[] = preAlign(lhs, augend, padding, mc);
1357
matchScale(arg);
1358
lhs = arg[0];
1359
augend = arg[1];
1360
}
1361
return doRound(lhs.inflated().add(augend.inflated()), lhs.scale, mc);
1362
}
1363
1364
/**
1365
* Returns an array of length two, the sum of whose entries is
1366
* equal to the rounded sum of the {@code BigDecimal} arguments.
1367
*
1368
* <p>If the digit positions of the arguments have a sufficient
1369
* gap between them, the value smaller in magnitude can be
1370
* condensed into a {@literal "sticky bit"} and the end result will
1371
* round the same way <em>if</em> the precision of the final
1372
* result does not include the high order digit of the small
1373
* magnitude operand.
1374
*
1375
* <p>Note that while strictly speaking this is an optimization,
1376
* it makes a much wider range of additions practical.
1377
*
1378
* <p>This corresponds to a pre-shift operation in a fixed
1379
* precision floating-point adder; this method is complicated by
1380
* variable precision of the result as determined by the
1381
* MathContext. A more nuanced operation could implement a
1382
* {@literal "right shift"} on the smaller magnitude operand so
1383
* that the number of digits of the smaller operand could be
1384
* reduced even though the significands partially overlapped.
1385
*/
1386
private BigDecimal[] preAlign(BigDecimal lhs, BigDecimal augend, long padding, MathContext mc) {
1387
assert padding != 0;
1388
BigDecimal big;
1389
BigDecimal small;
1390
1391
if (padding < 0) { // lhs is big; augend is small
1392
big = lhs;
1393
small = augend;
1394
} else { // lhs is small; augend is big
1395
big = augend;
1396
small = lhs;
1397
}
1398
1399
/*
1400
* This is the estimated scale of an ulp of the result; it assumes that
1401
* the result doesn't have a carry-out on a true add (e.g. 999 + 1 =>
1402
* 1000) or any subtractive cancellation on borrowing (e.g. 100 - 1.2 =>
1403
* 98.8)
1404
*/
1405
long estResultUlpScale = (long) big.scale - big.precision() + mc.precision;
1406
1407
/*
1408
* The low-order digit position of big is big.scale(). This
1409
* is true regardless of whether big has a positive or
1410
* negative scale. The high-order digit position of small is
1411
* small.scale - (small.precision() - 1). To do the full
1412
* condensation, the digit positions of big and small must be
1413
* disjoint *and* the digit positions of small should not be
1414
* directly visible in the result.
1415
*/
1416
long smallHighDigitPos = (long) small.scale - small.precision() + 1;
1417
if (smallHighDigitPos > big.scale + 2 && // big and small disjoint
1418
smallHighDigitPos > estResultUlpScale + 2) { // small digits not visible
1419
small = BigDecimal.valueOf(small.signum(), this.checkScale(Math.max(big.scale, estResultUlpScale) + 3));
1420
}
1421
1422
// Since addition is symmetric, preserving input order in
1423
// returned operands doesn't matter
1424
BigDecimal[] result = {big, small};
1425
return result;
1426
}
1427
1428
/**
1429
* Returns a {@code BigDecimal} whose value is {@code (this -
1430
* subtrahend)}, and whose scale is {@code max(this.scale(),
1431
* subtrahend.scale())}.
1432
*
1433
* @param subtrahend value to be subtracted from this {@code BigDecimal}.
1434
* @return {@code this - subtrahend}
1435
*/
1436
public BigDecimal subtract(BigDecimal subtrahend) {
1437
if (this.intCompact != INFLATED) {
1438
if ((subtrahend.intCompact != INFLATED)) {
1439
return add(this.intCompact, this.scale, -subtrahend.intCompact, subtrahend.scale);
1440
} else {
1441
return add(this.intCompact, this.scale, subtrahend.intVal.negate(), subtrahend.scale);
1442
}
1443
} else {
1444
if ((subtrahend.intCompact != INFLATED)) {
1445
// Pair of subtrahend values given before pair of
1446
// values from this BigDecimal to avoid need for
1447
// method overloading on the specialized add method
1448
return add(-subtrahend.intCompact, subtrahend.scale, this.intVal, this.scale);
1449
} else {
1450
return add(this.intVal, this.scale, subtrahend.intVal.negate(), subtrahend.scale);
1451
}
1452
}
1453
}
1454
1455
/**
1456
* Returns a {@code BigDecimal} whose value is {@code (this - subtrahend)},
1457
* with rounding according to the context settings.
1458
*
1459
* If {@code subtrahend} is zero then this, rounded if necessary, is used as the
1460
* result. If this is zero then the result is {@code subtrahend.negate(mc)}.
1461
*
1462
* @param subtrahend value to be subtracted from this {@code BigDecimal}.
1463
* @param mc the context to use.
1464
* @return {@code this - subtrahend}, rounded as necessary.
1465
* @throws ArithmeticException if the result is inexact but the
1466
* rounding mode is {@code UNNECESSARY}.
1467
* @since 1.5
1468
*/
1469
public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) {
1470
if (mc.precision == 0)
1471
return subtract(subtrahend);
1472
// share the special rounding code in add()
1473
return add(subtrahend.negate(), mc);
1474
}
1475
1476
/**
1477
* Returns a {@code BigDecimal} whose value is <tt>(this &times;
1478
* multiplicand)</tt>, and whose scale is {@code (this.scale() +
1479
* multiplicand.scale())}.
1480
*
1481
* @param multiplicand value to be multiplied by this {@code BigDecimal}.
1482
* @return {@code this * multiplicand}
1483
*/
1484
public BigDecimal multiply(BigDecimal multiplicand) {
1485
int productScale = checkScale((long) scale + multiplicand.scale);
1486
if (this.intCompact != INFLATED) {
1487
if ((multiplicand.intCompact != INFLATED)) {
1488
return multiply(this.intCompact, multiplicand.intCompact, productScale);
1489
} else {
1490
return multiply(this.intCompact, multiplicand.intVal, productScale);
1491
}
1492
} else {
1493
if ((multiplicand.intCompact != INFLATED)) {
1494
return multiply(multiplicand.intCompact, this.intVal, productScale);
1495
} else {
1496
return multiply(this.intVal, multiplicand.intVal, productScale);
1497
}
1498
}
1499
}
1500
1501
/**
1502
* Returns a {@code BigDecimal} whose value is <tt>(this &times;
1503
* multiplicand)</tt>, with rounding according to the context settings.
1504
*
1505
* @param multiplicand value to be multiplied by this {@code BigDecimal}.
1506
* @param mc the context to use.
1507
* @return {@code this * multiplicand}, rounded as necessary.
1508
* @throws ArithmeticException if the result is inexact but the
1509
* rounding mode is {@code UNNECESSARY}.
1510
* @since 1.5
1511
*/
1512
public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) {
1513
if (mc.precision == 0)
1514
return multiply(multiplicand);
1515
int productScale = checkScale((long) scale + multiplicand.scale);
1516
if (this.intCompact != INFLATED) {
1517
if ((multiplicand.intCompact != INFLATED)) {
1518
return multiplyAndRound(this.intCompact, multiplicand.intCompact, productScale, mc);
1519
} else {
1520
return multiplyAndRound(this.intCompact, multiplicand.intVal, productScale, mc);
1521
}
1522
} else {
1523
if ((multiplicand.intCompact != INFLATED)) {
1524
return multiplyAndRound(multiplicand.intCompact, this.intVal, productScale, mc);
1525
} else {
1526
return multiplyAndRound(this.intVal, multiplicand.intVal, productScale, mc);
1527
}
1528
}
1529
}
1530
1531
/**
1532
* Returns a {@code BigDecimal} whose value is {@code (this /
1533
* divisor)}, and whose scale is as specified. If rounding must
1534
* be performed to generate a result with the specified scale, the
1535
* specified rounding mode is applied.
1536
*
1537
* <p>The new {@link #divide(BigDecimal, int, RoundingMode)} method
1538
* should be used in preference to this legacy method.
1539
*
1540
* @param divisor value by which this {@code BigDecimal} is to be divided.
1541
* @param scale scale of the {@code BigDecimal} quotient to be returned.
1542
* @param roundingMode rounding mode to apply.
1543
* @return {@code this / divisor}
1544
* @throws ArithmeticException if {@code divisor} is zero,
1545
* {@code roundingMode==ROUND_UNNECESSARY} and
1546
* the specified scale is insufficient to represent the result
1547
* of the division exactly.
1548
* @throws IllegalArgumentException if {@code roundingMode} does not
1549
* represent a valid rounding mode.
1550
* @see #ROUND_UP
1551
* @see #ROUND_DOWN
1552
* @see #ROUND_CEILING
1553
* @see #ROUND_FLOOR
1554
* @see #ROUND_HALF_UP
1555
* @see #ROUND_HALF_DOWN
1556
* @see #ROUND_HALF_EVEN
1557
* @see #ROUND_UNNECESSARY
1558
*/
1559
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
1560
if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
1561
throw new IllegalArgumentException("Invalid rounding mode");
1562
if (this.intCompact != INFLATED) {
1563
if ((divisor.intCompact != INFLATED)) {
1564
return divide(this.intCompact, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);
1565
} else {
1566
return divide(this.intCompact, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);
1567
}
1568
} else {
1569
if ((divisor.intCompact != INFLATED)) {
1570
return divide(this.intVal, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);
1571
} else {
1572
return divide(this.intVal, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);
1573
}
1574
}
1575
}
1576
1577
/**
1578
* Returns a {@code BigDecimal} whose value is {@code (this /
1579
* divisor)}, and whose scale is as specified. If rounding must
1580
* be performed to generate a result with the specified scale, the
1581
* specified rounding mode is applied.
1582
*
1583
* @param divisor value by which this {@code BigDecimal} is to be divided.
1584
* @param scale scale of the {@code BigDecimal} quotient to be returned.
1585
* @param roundingMode rounding mode to apply.
1586
* @return {@code this / divisor}
1587
* @throws ArithmeticException if {@code divisor} is zero,
1588
* {@code roundingMode==RoundingMode.UNNECESSARY} and
1589
* the specified scale is insufficient to represent the result
1590
* of the division exactly.
1591
* @since 1.5
1592
*/
1593
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
1594
return divide(divisor, scale, roundingMode.oldMode);
1595
}
1596
1597
/**
1598
* Returns a {@code BigDecimal} whose value is {@code (this /
1599
* divisor)}, and whose scale is {@code this.scale()}. If
1600
* rounding must be performed to generate a result with the given
1601
* scale, the specified rounding mode is applied.
1602
*
1603
* <p>The new {@link #divide(BigDecimal, RoundingMode)} method
1604
* should be used in preference to this legacy method.
1605
*
1606
* @param divisor value by which this {@code BigDecimal} is to be divided.
1607
* @param roundingMode rounding mode to apply.
1608
* @return {@code this / divisor}
1609
* @throws ArithmeticException if {@code divisor==0}, or
1610
* {@code roundingMode==ROUND_UNNECESSARY} and
1611
* {@code this.scale()} is insufficient to represent the result
1612
* of the division exactly.
1613
* @throws IllegalArgumentException if {@code roundingMode} does not
1614
* represent a valid rounding mode.
1615
* @see #ROUND_UP
1616
* @see #ROUND_DOWN
1617
* @see #ROUND_CEILING
1618
* @see #ROUND_FLOOR
1619
* @see #ROUND_HALF_UP
1620
* @see #ROUND_HALF_DOWN
1621
* @see #ROUND_HALF_EVEN
1622
* @see #ROUND_UNNECESSARY
1623
*/
1624
public BigDecimal divide(BigDecimal divisor, int roundingMode) {
1625
return this.divide(divisor, scale, roundingMode);
1626
}
1627
1628
/**
1629
* Returns a {@code BigDecimal} whose value is {@code (this /
1630
* divisor)}, and whose scale is {@code this.scale()}. If
1631
* rounding must be performed to generate a result with the given
1632
* scale, the specified rounding mode is applied.
1633
*
1634
* @param divisor value by which this {@code BigDecimal} is to be divided.
1635
* @param roundingMode rounding mode to apply.
1636
* @return {@code this / divisor}
1637
* @throws ArithmeticException if {@code divisor==0}, or
1638
* {@code roundingMode==RoundingMode.UNNECESSARY} and
1639
* {@code this.scale()} is insufficient to represent the result
1640
* of the division exactly.
1641
* @since 1.5
1642
*/
1643
public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) {
1644
return this.divide(divisor, scale, roundingMode.oldMode);
1645
}
1646
1647
/**
1648
* Returns a {@code BigDecimal} whose value is {@code (this /
1649
* divisor)}, and whose preferred scale is {@code (this.scale() -
1650
* divisor.scale())}; if the exact quotient cannot be
1651
* represented (because it has a non-terminating decimal
1652
* expansion) an {@code ArithmeticException} is thrown.
1653
*
1654
* @param divisor value by which this {@code BigDecimal} is to be divided.
1655
* @throws ArithmeticException if the exact quotient does not have a
1656
* terminating decimal expansion
1657
* @return {@code this / divisor}
1658
* @since 1.5
1659
* @author Joseph D. Darcy
1660
*/
1661
public BigDecimal divide(BigDecimal divisor) {
1662
/*
1663
* Handle zero cases first.
1664
*/
1665
if (divisor.signum() == 0) { // x/0
1666
if (this.signum() == 0) // 0/0
1667
throw new ArithmeticException("Division undefined"); // NaN
1668
throw new ArithmeticException("Division by zero");
1669
}
1670
1671
// Calculate preferred scale
1672
int preferredScale = saturateLong((long) this.scale - divisor.scale);
1673
1674
if (this.signum() == 0) // 0/y
1675
return zeroValueOf(preferredScale);
1676
else {
1677
/*
1678
* If the quotient this/divisor has a terminating decimal
1679
* expansion, the expansion can have no more than
1680
* (a.precision() + ceil(10*b.precision)/3) digits.
1681
* Therefore, create a MathContext object with this
1682
* precision and do a divide with the UNNECESSARY rounding
1683
* mode.
1684
*/
1685
MathContext mc = new MathContext( (int)Math.min(this.precision() +
1686
(long)Math.ceil(10.0*divisor.precision()/3.0),
1687
Integer.MAX_VALUE),
1688
RoundingMode.UNNECESSARY);
1689
BigDecimal quotient;
1690
try {
1691
quotient = this.divide(divisor, mc);
1692
} catch (ArithmeticException e) {
1693
throw new ArithmeticException("Non-terminating decimal expansion; " +
1694
"no exact representable decimal result.");
1695
}
1696
1697
int quotientScale = quotient.scale();
1698
1699
// divide(BigDecimal, mc) tries to adjust the quotient to
1700
// the desired one by removing trailing zeros; since the
1701
// exact divide method does not have an explicit digit
1702
// limit, we can add zeros too.
1703
if (preferredScale > quotientScale)
1704
return quotient.setScale(preferredScale, ROUND_UNNECESSARY);
1705
1706
return quotient;
1707
}
1708
}
1709
1710
/**
1711
* Returns a {@code BigDecimal} whose value is {@code (this /
1712
* divisor)}, with rounding according to the context settings.
1713
*
1714
* @param divisor value by which this {@code BigDecimal} is to be divided.
1715
* @param mc the context to use.
1716
* @return {@code this / divisor}, rounded as necessary.
1717
* @throws ArithmeticException if the result is inexact but the
1718
* rounding mode is {@code UNNECESSARY} or
1719
* {@code mc.precision == 0} and the quotient has a
1720
* non-terminating decimal expansion.
1721
* @since 1.5
1722
*/
1723
public BigDecimal divide(BigDecimal divisor, MathContext mc) {
1724
int mcp = mc.precision;
1725
if (mcp == 0)
1726
return divide(divisor);
1727
1728
BigDecimal dividend = this;
1729
long preferredScale = (long)dividend.scale - divisor.scale;
1730
// Now calculate the answer. We use the existing
1731
// divide-and-round method, but as this rounds to scale we have
1732
// to normalize the values here to achieve the desired result.
1733
// For x/y we first handle y=0 and x=0, and then normalize x and
1734
// y to give x' and y' with the following constraints:
1735
// (a) 0.1 <= x' < 1
1736
// (b) x' <= y' < 10*x'
1737
// Dividing x'/y' with the required scale set to mc.precision then
1738
// will give a result in the range 0.1 to 1 rounded to exactly
1739
// the right number of digits (except in the case of a result of
1740
// 1.000... which can arise when x=y, or when rounding overflows
1741
// The 1.000... case will reduce properly to 1.
1742
if (divisor.signum() == 0) { // x/0
1743
if (dividend.signum() == 0) // 0/0
1744
throw new ArithmeticException("Division undefined"); // NaN
1745
throw new ArithmeticException("Division by zero");
1746
}
1747
if (dividend.signum() == 0) // 0/y
1748
return zeroValueOf(saturateLong(preferredScale));
1749
int xscale = dividend.precision();
1750
int yscale = divisor.precision();
1751
if(dividend.intCompact!=INFLATED) {
1752
if(divisor.intCompact!=INFLATED) {
1753
return divide(dividend.intCompact, xscale, divisor.intCompact, yscale, preferredScale, mc);
1754
} else {
1755
return divide(dividend.intCompact, xscale, divisor.intVal, yscale, preferredScale, mc);
1756
}
1757
} else {
1758
if(divisor.intCompact!=INFLATED) {
1759
return divide(dividend.intVal, xscale, divisor.intCompact, yscale, preferredScale, mc);
1760
} else {
1761
return divide(dividend.intVal, xscale, divisor.intVal, yscale, preferredScale, mc);
1762
}
1763
}
1764
}
1765
1766
/**
1767
* Returns a {@code BigDecimal} whose value is the integer part
1768
* of the quotient {@code (this / divisor)} rounded down. The
1769
* preferred scale of the result is {@code (this.scale() -
1770
* divisor.scale())}.
1771
*
1772
* @param divisor value by which this {@code BigDecimal} is to be divided.
1773
* @return The integer part of {@code this / divisor}.
1774
* @throws ArithmeticException if {@code divisor==0}
1775
* @since 1.5
1776
*/
1777
public BigDecimal divideToIntegralValue(BigDecimal divisor) {
1778
// Calculate preferred scale
1779
int preferredScale = saturateLong((long) this.scale - divisor.scale);
1780
if (this.compareMagnitude(divisor) < 0) {
1781
// much faster when this << divisor
1782
return zeroValueOf(preferredScale);
1783
}
1784
1785
if (this.signum() == 0 && divisor.signum() != 0)
1786
return this.setScale(preferredScale, ROUND_UNNECESSARY);
1787
1788
// Perform a divide with enough digits to round to a correct
1789
// integer value; then remove any fractional digits
1790
1791
int maxDigits = (int)Math.min(this.precision() +
1792
(long)Math.ceil(10.0*divisor.precision()/3.0) +
1793
Math.abs((long)this.scale() - divisor.scale()) + 2,
1794
Integer.MAX_VALUE);
1795
BigDecimal quotient = this.divide(divisor, new MathContext(maxDigits,
1796
RoundingMode.DOWN));
1797
if (quotient.scale > 0) {
1798
quotient = quotient.setScale(0, RoundingMode.DOWN);
1799
quotient = stripZerosToMatchScale(quotient.intVal, quotient.intCompact, quotient.scale, preferredScale);
1800
}
1801
1802
if (quotient.scale < preferredScale) {
1803
// pad with zeros if necessary
1804
quotient = quotient.setScale(preferredScale, ROUND_UNNECESSARY);
1805
}
1806
1807
return quotient;
1808
}
1809
1810
/**
1811
* Returns a {@code BigDecimal} whose value is the integer part
1812
* of {@code (this / divisor)}. Since the integer part of the
1813
* exact quotient does not depend on the rounding mode, the
1814
* rounding mode does not affect the values returned by this
1815
* method. The preferred scale of the result is
1816
* {@code (this.scale() - divisor.scale())}. An
1817
* {@code ArithmeticException} is thrown if the integer part of
1818
* the exact quotient needs more than {@code mc.precision}
1819
* digits.
1820
*
1821
* @param divisor value by which this {@code BigDecimal} is to be divided.
1822
* @param mc the context to use.
1823
* @return The integer part of {@code this / divisor}.
1824
* @throws ArithmeticException if {@code divisor==0}
1825
* @throws ArithmeticException if {@code mc.precision} {@literal >} 0 and the result
1826
* requires a precision of more than {@code mc.precision} digits.
1827
* @since 1.5
1828
* @author Joseph D. Darcy
1829
*/
1830
public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) {
1831
if (mc.precision == 0 || // exact result
1832
(this.compareMagnitude(divisor) < 0)) // zero result
1833
return divideToIntegralValue(divisor);
1834
1835
// Calculate preferred scale
1836
int preferredScale = saturateLong((long)this.scale - divisor.scale);
1837
1838
/*
1839
* Perform a normal divide to mc.precision digits. If the
1840
* remainder has absolute value less than the divisor, the
1841
* integer portion of the quotient fits into mc.precision
1842
* digits. Next, remove any fractional digits from the
1843
* quotient and adjust the scale to the preferred value.
1844
*/
1845
BigDecimal result = this.divide(divisor, new MathContext(mc.precision, RoundingMode.DOWN));
1846
1847
if (result.scale() < 0) {
1848
/*
1849
* Result is an integer. See if quotient represents the
1850
* full integer portion of the exact quotient; if it does,
1851
* the computed remainder will be less than the divisor.
1852
*/
1853
BigDecimal product = result.multiply(divisor);
1854
// If the quotient is the full integer value,
1855
// |dividend-product| < |divisor|.
1856
if (this.subtract(product).compareMagnitude(divisor) >= 0) {
1857
throw new ArithmeticException("Division impossible");
1858
}
1859
} else if (result.scale() > 0) {
1860
/*
1861
* Integer portion of quotient will fit into precision
1862
* digits; recompute quotient to scale 0 to avoid double
1863
* rounding and then try to adjust, if necessary.
1864
*/
1865
result = result.setScale(0, RoundingMode.DOWN);
1866
}
1867
// else result.scale() == 0;
1868
1869
int precisionDiff;
1870
if ((preferredScale > result.scale()) &&
1871
(precisionDiff = mc.precision - result.precision()) > 0) {
1872
return result.setScale(result.scale() +
1873
Math.min(precisionDiff, preferredScale - result.scale) );
1874
} else {
1875
return stripZerosToMatchScale(result.intVal,result.intCompact,result.scale,preferredScale);
1876
}
1877
}
1878
1879
/**
1880
* Returns a {@code BigDecimal} whose value is {@code (this % divisor)}.
1881
*
1882
* <p>The remainder is given by
1883
* {@code this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))}.
1884
* Note that this is not the modulo operation (the result can be
1885
* negative).
1886
*
1887
* @param divisor value by which this {@code BigDecimal} is to be divided.
1888
* @return {@code this % divisor}.
1889
* @throws ArithmeticException if {@code divisor==0}
1890
* @since 1.5
1891
*/
1892
public BigDecimal remainder(BigDecimal divisor) {
1893
BigDecimal divrem[] = this.divideAndRemainder(divisor);
1894
return divrem[1];
1895
}
1896
1897
1898
/**
1899
* Returns a {@code BigDecimal} whose value is {@code (this %
1900
* divisor)}, with rounding according to the context settings.
1901
* The {@code MathContext} settings affect the implicit divide
1902
* used to compute the remainder. The remainder computation
1903
* itself is by definition exact. Therefore, the remainder may
1904
* contain more than {@code mc.getPrecision()} digits.
1905
*
1906
* <p>The remainder is given by
1907
* {@code this.subtract(this.divideToIntegralValue(divisor,
1908
* mc).multiply(divisor))}. Note that this is not the modulo
1909
* operation (the result can be negative).
1910
*
1911
* @param divisor value by which this {@code BigDecimal} is to be divided.
1912
* @param mc the context to use.
1913
* @return {@code this % divisor}, rounded as necessary.
1914
* @throws ArithmeticException if {@code divisor==0}
1915
* @throws ArithmeticException if the result is inexact but the
1916
* rounding mode is {@code UNNECESSARY}, or {@code mc.precision}
1917
* {@literal >} 0 and the result of {@code this.divideToIntgralValue(divisor)} would
1918
* require a precision of more than {@code mc.precision} digits.
1919
* @see #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1920
* @since 1.5
1921
*/
1922
public BigDecimal remainder(BigDecimal divisor, MathContext mc) {
1923
BigDecimal divrem[] = this.divideAndRemainder(divisor, mc);
1924
return divrem[1];
1925
}
1926
1927
/**
1928
* Returns a two-element {@code BigDecimal} array containing the
1929
* result of {@code divideToIntegralValue} followed by the result of
1930
* {@code remainder} on the two operands.
1931
*
1932
* <p>Note that if both the integer quotient and remainder are
1933
* needed, this method is faster than using the
1934
* {@code divideToIntegralValue} and {@code remainder} methods
1935
* separately because the division need only be carried out once.
1936
*
1937
* @param divisor value by which this {@code BigDecimal} is to be divided,
1938
* and the remainder computed.
1939
* @return a two element {@code BigDecimal} array: the quotient
1940
* (the result of {@code divideToIntegralValue}) is the initial element
1941
* and the remainder is the final element.
1942
* @throws ArithmeticException if {@code divisor==0}
1943
* @see #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1944
* @see #remainder(java.math.BigDecimal, java.math.MathContext)
1945
* @since 1.5
1946
*/
1947
public BigDecimal[] divideAndRemainder(BigDecimal divisor) {
1948
// we use the identity x = i * y + r to determine r
1949
BigDecimal[] result = new BigDecimal[2];
1950
1951
result[0] = this.divideToIntegralValue(divisor);
1952
result[1] = this.subtract(result[0].multiply(divisor));
1953
return result;
1954
}
1955
1956
/**
1957
* Returns a two-element {@code BigDecimal} array containing the
1958
* result of {@code divideToIntegralValue} followed by the result of
1959
* {@code remainder} on the two operands calculated with rounding
1960
* according to the context settings.
1961
*
1962
* <p>Note that if both the integer quotient and remainder are
1963
* needed, this method is faster than using the
1964
* {@code divideToIntegralValue} and {@code remainder} methods
1965
* separately because the division need only be carried out once.
1966
*
1967
* @param divisor value by which this {@code BigDecimal} is to be divided,
1968
* and the remainder computed.
1969
* @param mc the context to use.
1970
* @return a two element {@code BigDecimal} array: the quotient
1971
* (the result of {@code divideToIntegralValue}) is the
1972
* initial element and the remainder is the final element.
1973
* @throws ArithmeticException if {@code divisor==0}
1974
* @throws ArithmeticException if the result is inexact but the
1975
* rounding mode is {@code UNNECESSARY}, or {@code mc.precision}
1976
* {@literal >} 0 and the result of {@code this.divideToIntgralValue(divisor)} would
1977
* require a precision of more than {@code mc.precision} digits.
1978
* @see #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1979
* @see #remainder(java.math.BigDecimal, java.math.MathContext)
1980
* @since 1.5
1981
*/
1982
public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) {
1983
if (mc.precision == 0)
1984
return divideAndRemainder(divisor);
1985
1986
BigDecimal[] result = new BigDecimal[2];
1987
BigDecimal lhs = this;
1988
1989
result[0] = lhs.divideToIntegralValue(divisor, mc);
1990
result[1] = lhs.subtract(result[0].multiply(divisor));
1991
return result;
1992
}
1993
1994
/**
1995
* Returns a {@code BigDecimal} whose value is
1996
* <tt>(this<sup>n</sup>)</tt>, The power is computed exactly, to
1997
* unlimited precision.
1998
*
1999
* <p>The parameter {@code n} must be in the range 0 through
2000
* 999999999, inclusive. {@code ZERO.pow(0)} returns {@link
2001
* #ONE}.
2002
*
2003
* Note that future releases may expand the allowable exponent
2004
* range of this method.
2005
*
2006
* @param n power to raise this {@code BigDecimal} to.
2007
* @return <tt>this<sup>n</sup></tt>
2008
* @throws ArithmeticException if {@code n} is out of range.
2009
* @since 1.5
2010
*/
2011
public BigDecimal pow(int n) {
2012
if (n < 0 || n > 999999999)
2013
throw new ArithmeticException("Invalid operation");
2014
// No need to calculate pow(n) if result will over/underflow.
2015
// Don't attempt to support "supernormal" numbers.
2016
int newScale = checkScale((long)scale * n);
2017
return new BigDecimal(this.inflated().pow(n), newScale);
2018
}
2019
2020
2021
/**
2022
* Returns a {@code BigDecimal} whose value is
2023
* <tt>(this<sup>n</sup>)</tt>. The current implementation uses
2024
* the core algorithm defined in ANSI standard X3.274-1996 with
2025
* rounding according to the context settings. In general, the
2026
* returned numerical value is within two ulps of the exact
2027
* numerical value for the chosen precision. Note that future
2028
* releases may use a different algorithm with a decreased
2029
* allowable error bound and increased allowable exponent range.
2030
*
2031
* <p>The X3.274-1996 algorithm is:
2032
*
2033
* <ul>
2034
* <li> An {@code ArithmeticException} exception is thrown if
2035
* <ul>
2036
* <li>{@code abs(n) > 999999999}
2037
* <li>{@code mc.precision == 0} and {@code n < 0}
2038
* <li>{@code mc.precision > 0} and {@code n} has more than
2039
* {@code mc.precision} decimal digits
2040
* </ul>
2041
*
2042
* <li> if {@code n} is zero, {@link #ONE} is returned even if
2043
* {@code this} is zero, otherwise
2044
* <ul>
2045
* <li> if {@code n} is positive, the result is calculated via
2046
* the repeated squaring technique into a single accumulator.
2047
* The individual multiplications with the accumulator use the
2048
* same math context settings as in {@code mc} except for a
2049
* precision increased to {@code mc.precision + elength + 1}
2050
* where {@code elength} is the number of decimal digits in
2051
* {@code n}.
2052
*
2053
* <li> if {@code n} is negative, the result is calculated as if
2054
* {@code n} were positive; this value is then divided into one
2055
* using the working precision specified above.
2056
*
2057
* <li> The final value from either the positive or negative case
2058
* is then rounded to the destination precision.
2059
* </ul>
2060
* </ul>
2061
*
2062
* @param n power to raise this {@code BigDecimal} to.
2063
* @param mc the context to use.
2064
* @return <tt>this<sup>n</sup></tt> using the ANSI standard X3.274-1996
2065
* algorithm
2066
* @throws ArithmeticException if the result is inexact but the
2067
* rounding mode is {@code UNNECESSARY}, or {@code n} is out
2068
* of range.
2069
* @since 1.5
2070
*/
2071
public BigDecimal pow(int n, MathContext mc) {
2072
if (mc.precision == 0)
2073
return pow(n);
2074
if (n < -999999999 || n > 999999999)
2075
throw new ArithmeticException("Invalid operation");
2076
if (n == 0)
2077
return ONE; // x**0 == 1 in X3.274
2078
BigDecimal lhs = this;
2079
MathContext workmc = mc; // working settings
2080
int mag = Math.abs(n); // magnitude of n
2081
if (mc.precision > 0) {
2082
int elength = longDigitLength(mag); // length of n in digits
2083
if (elength > mc.precision) // X3.274 rule
2084
throw new ArithmeticException("Invalid operation");
2085
workmc = new MathContext(mc.precision + elength + 1,
2086
mc.roundingMode);
2087
}
2088
// ready to carry out power calculation...
2089
BigDecimal acc = ONE; // accumulator
2090
boolean seenbit = false; // set once we've seen a 1-bit
2091
for (int i=1;;i++) { // for each bit [top bit ignored]
2092
mag += mag; // shift left 1 bit
2093
if (mag < 0) { // top bit is set
2094
seenbit = true; // OK, we're off
2095
acc = acc.multiply(lhs, workmc); // acc=acc*x
2096
}
2097
if (i == 31)
2098
break; // that was the last bit
2099
if (seenbit)
2100
acc=acc.multiply(acc, workmc); // acc=acc*acc [square]
2101
// else (!seenbit) no point in squaring ONE
2102
}
2103
// if negative n, calculate the reciprocal using working precision
2104
if (n < 0) // [hence mc.precision>0]
2105
acc=ONE.divide(acc, workmc);
2106
// round to final precision and strip zeros
2107
return doRound(acc, mc);
2108
}
2109
2110
/**
2111
* Returns a {@code BigDecimal} whose value is the absolute value
2112
* of this {@code BigDecimal}, and whose scale is
2113
* {@code this.scale()}.
2114
*
2115
* @return {@code abs(this)}
2116
*/
2117
public BigDecimal abs() {
2118
return (signum() < 0 ? negate() : this);
2119
}
2120
2121
/**
2122
* Returns a {@code BigDecimal} whose value is the absolute value
2123
* of this {@code BigDecimal}, with rounding according to the
2124
* context settings.
2125
*
2126
* @param mc the context to use.
2127
* @return {@code abs(this)}, rounded as necessary.
2128
* @throws ArithmeticException if the result is inexact but the
2129
* rounding mode is {@code UNNECESSARY}.
2130
* @since 1.5
2131
*/
2132
public BigDecimal abs(MathContext mc) {
2133
return (signum() < 0 ? negate(mc) : plus(mc));
2134
}
2135
2136
/**
2137
* Returns a {@code BigDecimal} whose value is {@code (-this)},
2138
* and whose scale is {@code this.scale()}.
2139
*
2140
* @return {@code -this}.
2141
*/
2142
public BigDecimal negate() {
2143
if (intCompact == INFLATED) {
2144
return new BigDecimal(intVal.negate(), INFLATED, scale, precision);
2145
} else {
2146
return valueOf(-intCompact, scale, precision);
2147
}
2148
}
2149
2150
/**
2151
* Returns a {@code BigDecimal} whose value is {@code (-this)},
2152
* with rounding according to the context settings.
2153
*
2154
* @param mc the context to use.
2155
* @return {@code -this}, rounded as necessary.
2156
* @throws ArithmeticException if the result is inexact but the
2157
* rounding mode is {@code UNNECESSARY}.
2158
* @since 1.5
2159
*/
2160
public BigDecimal negate(MathContext mc) {
2161
return negate().plus(mc);
2162
}
2163
2164
/**
2165
* Returns a {@code BigDecimal} whose value is {@code (+this)}, and whose
2166
* scale is {@code this.scale()}.
2167
*
2168
* <p>This method, which simply returns this {@code BigDecimal}
2169
* is included for symmetry with the unary minus method {@link
2170
* #negate()}.
2171
*
2172
* @return {@code this}.
2173
* @see #negate()
2174
* @since 1.5
2175
*/
2176
public BigDecimal plus() {
2177
return this;
2178
}
2179
2180
/**
2181
* Returns a {@code BigDecimal} whose value is {@code (+this)},
2182
* with rounding according to the context settings.
2183
*
2184
* <p>The effect of this method is identical to that of the {@link
2185
* #round(MathContext)} method.
2186
*
2187
* @param mc the context to use.
2188
* @return {@code this}, rounded as necessary. A zero result will
2189
* have a scale of 0.
2190
* @throws ArithmeticException if the result is inexact but the
2191
* rounding mode is {@code UNNECESSARY}.
2192
* @see #round(MathContext)
2193
* @since 1.5
2194
*/
2195
public BigDecimal plus(MathContext mc) {
2196
if (mc.precision == 0) // no rounding please
2197
return this;
2198
return doRound(this, mc);
2199
}
2200
2201
/**
2202
* Returns the signum function of this {@code BigDecimal}.
2203
*
2204
* @return -1, 0, or 1 as the value of this {@code BigDecimal}
2205
* is negative, zero, or positive.
2206
*/
2207
public int signum() {
2208
return (intCompact != INFLATED)?
2209
Long.signum(intCompact):
2210
intVal.signum();
2211
}
2212
2213
/**
2214
* Returns the <i>scale</i> of this {@code BigDecimal}. If zero
2215
* or positive, the scale is the number of digits to the right of
2216
* the decimal point. If negative, the unscaled value of the
2217
* number is multiplied by ten to the power of the negation of the
2218
* scale. For example, a scale of {@code -3} means the unscaled
2219
* value is multiplied by 1000.
2220
*
2221
* @return the scale of this {@code BigDecimal}.
2222
*/
2223
public int scale() {
2224
return scale;
2225
}
2226
2227
/**
2228
* Returns the <i>precision</i> of this {@code BigDecimal}. (The
2229
* precision is the number of digits in the unscaled value.)
2230
*
2231
* <p>The precision of a zero value is 1.
2232
*
2233
* @return the precision of this {@code BigDecimal}.
2234
* @since 1.5
2235
*/
2236
public int precision() {
2237
int result = precision;
2238
if (result == 0) {
2239
long s = intCompact;
2240
if (s != INFLATED)
2241
result = longDigitLength(s);
2242
else
2243
result = bigDigitLength(intVal);
2244
precision = result;
2245
}
2246
return result;
2247
}
2248
2249
2250
/**
2251
* Returns a {@code BigInteger} whose value is the <i>unscaled
2252
* value</i> of this {@code BigDecimal}. (Computes <tt>(this *
2253
* 10<sup>this.scale()</sup>)</tt>.)
2254
*
2255
* @return the unscaled value of this {@code BigDecimal}.
2256
* @since 1.2
2257
*/
2258
public BigInteger unscaledValue() {
2259
return this.inflated();
2260
}
2261
2262
// Rounding Modes
2263
2264
/**
2265
* Rounding mode to round away from zero. Always increments the
2266
* digit prior to a nonzero discarded fraction. Note that this rounding
2267
* mode never decreases the magnitude of the calculated value.
2268
*/
2269
public final static int ROUND_UP = 0;
2270
2271
/**
2272
* Rounding mode to round towards zero. Never increments the digit
2273
* prior to a discarded fraction (i.e., truncates). Note that this
2274
* rounding mode never increases the magnitude of the calculated value.
2275
*/
2276
public final static int ROUND_DOWN = 1;
2277
2278
/**
2279
* Rounding mode to round towards positive infinity. If the
2280
* {@code BigDecimal} is positive, behaves as for
2281
* {@code ROUND_UP}; if negative, behaves as for
2282
* {@code ROUND_DOWN}. Note that this rounding mode never
2283
* decreases the calculated value.
2284
*/
2285
public final static int ROUND_CEILING = 2;
2286
2287
/**
2288
* Rounding mode to round towards negative infinity. If the
2289
* {@code BigDecimal} is positive, behave as for
2290
* {@code ROUND_DOWN}; if negative, behave as for
2291
* {@code ROUND_UP}. Note that this rounding mode never
2292
* increases the calculated value.
2293
*/
2294
public final static int ROUND_FLOOR = 3;
2295
2296
/**
2297
* Rounding mode to round towards {@literal "nearest neighbor"}
2298
* unless both neighbors are equidistant, in which case round up.
2299
* Behaves as for {@code ROUND_UP} if the discarded fraction is
2300
* &ge; 0.5; otherwise, behaves as for {@code ROUND_DOWN}. Note
2301
* that this is the rounding mode that most of us were taught in
2302
* grade school.
2303
*/
2304
public final static int ROUND_HALF_UP = 4;
2305
2306
/**
2307
* Rounding mode to round towards {@literal "nearest neighbor"}
2308
* unless both neighbors are equidistant, in which case round
2309
* down. Behaves as for {@code ROUND_UP} if the discarded
2310
* fraction is {@literal >} 0.5; otherwise, behaves as for
2311
* {@code ROUND_DOWN}.
2312
*/
2313
public final static int ROUND_HALF_DOWN = 5;
2314
2315
/**
2316
* Rounding mode to round towards the {@literal "nearest neighbor"}
2317
* unless both neighbors are equidistant, in which case, round
2318
* towards the even neighbor. Behaves as for
2319
* {@code ROUND_HALF_UP} if the digit to the left of the
2320
* discarded fraction is odd; behaves as for
2321
* {@code ROUND_HALF_DOWN} if it's even. Note that this is the
2322
* rounding mode that minimizes cumulative error when applied
2323
* repeatedly over a sequence of calculations.
2324
*/
2325
public final static int ROUND_HALF_EVEN = 6;
2326
2327
/**
2328
* Rounding mode to assert that the requested operation has an exact
2329
* result, hence no rounding is necessary. If this rounding mode is
2330
* specified on an operation that yields an inexact result, an
2331
* {@code ArithmeticException} is thrown.
2332
*/
2333
public final static int ROUND_UNNECESSARY = 7;
2334
2335
2336
// Scaling/Rounding Operations
2337
2338
/**
2339
* Returns a {@code BigDecimal} rounded according to the
2340
* {@code MathContext} settings. If the precision setting is 0 then
2341
* no rounding takes place.
2342
*
2343
* <p>The effect of this method is identical to that of the
2344
* {@link #plus(MathContext)} method.
2345
*
2346
* @param mc the context to use.
2347
* @return a {@code BigDecimal} rounded according to the
2348
* {@code MathContext} settings.
2349
* @throws ArithmeticException if the rounding mode is
2350
* {@code UNNECESSARY} and the
2351
* {@code BigDecimal} operation would require rounding.
2352
* @see #plus(MathContext)
2353
* @since 1.5
2354
*/
2355
public BigDecimal round(MathContext mc) {
2356
return plus(mc);
2357
}
2358
2359
/**
2360
* Returns a {@code BigDecimal} whose scale is the specified
2361
* value, and whose unscaled value is determined by multiplying or
2362
* dividing this {@code BigDecimal}'s unscaled value by the
2363
* appropriate power of ten to maintain its overall value. If the
2364
* scale is reduced by the operation, the unscaled value must be
2365
* divided (rather than multiplied), and the value may be changed;
2366
* in this case, the specified rounding mode is applied to the
2367
* division.
2368
*
2369
* <p>Note that since BigDecimal objects are immutable, calls of
2370
* this method do <i>not</i> result in the original object being
2371
* modified, contrary to the usual convention of having methods
2372
* named <tt>set<i>X</i></tt> mutate field <i>{@code X}</i>.
2373
* Instead, {@code setScale} returns an object with the proper
2374
* scale; the returned object may or may not be newly allocated.
2375
*
2376
* @param newScale scale of the {@code BigDecimal} value to be returned.
2377
* @param roundingMode The rounding mode to apply.
2378
* @return a {@code BigDecimal} whose scale is the specified value,
2379
* and whose unscaled value is determined by multiplying or
2380
* dividing this {@code BigDecimal}'s unscaled value by the
2381
* appropriate power of ten to maintain its overall value.
2382
* @throws ArithmeticException if {@code roundingMode==UNNECESSARY}
2383
* and the specified scaling operation would require
2384
* rounding.
2385
* @see RoundingMode
2386
* @since 1.5
2387
*/
2388
public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
2389
return setScale(newScale, roundingMode.oldMode);
2390
}
2391
2392
/**
2393
* Returns a {@code BigDecimal} whose scale is the specified
2394
* value, and whose unscaled value is determined by multiplying or
2395
* dividing this {@code BigDecimal}'s unscaled value by the
2396
* appropriate power of ten to maintain its overall value. If the
2397
* scale is reduced by the operation, the unscaled value must be
2398
* divided (rather than multiplied), and the value may be changed;
2399
* in this case, the specified rounding mode is applied to the
2400
* division.
2401
*
2402
* <p>Note that since BigDecimal objects are immutable, calls of
2403
* this method do <i>not</i> result in the original object being
2404
* modified, contrary to the usual convention of having methods
2405
* named <tt>set<i>X</i></tt> mutate field <i>{@code X}</i>.
2406
* Instead, {@code setScale} returns an object with the proper
2407
* scale; the returned object may or may not be newly allocated.
2408
*
2409
* <p>The new {@link #setScale(int, RoundingMode)} method should
2410
* be used in preference to this legacy method.
2411
*
2412
* @param newScale scale of the {@code BigDecimal} value to be returned.
2413
* @param roundingMode The rounding mode to apply.
2414
* @return a {@code BigDecimal} whose scale is the specified value,
2415
* and whose unscaled value is determined by multiplying or
2416
* dividing this {@code BigDecimal}'s unscaled value by the
2417
* appropriate power of ten to maintain its overall value.
2418
* @throws ArithmeticException if {@code roundingMode==ROUND_UNNECESSARY}
2419
* and the specified scaling operation would require
2420
* rounding.
2421
* @throws IllegalArgumentException if {@code roundingMode} does not
2422
* represent a valid rounding mode.
2423
* @see #ROUND_UP
2424
* @see #ROUND_DOWN
2425
* @see #ROUND_CEILING
2426
* @see #ROUND_FLOOR
2427
* @see #ROUND_HALF_UP
2428
* @see #ROUND_HALF_DOWN
2429
* @see #ROUND_HALF_EVEN
2430
* @see #ROUND_UNNECESSARY
2431
*/
2432
public BigDecimal setScale(int newScale, int roundingMode) {
2433
if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
2434
throw new IllegalArgumentException("Invalid rounding mode");
2435
2436
int oldScale = this.scale;
2437
if (newScale == oldScale) // easy case
2438
return this;
2439
if (this.signum() == 0) // zero can have any scale
2440
return zeroValueOf(newScale);
2441
if(this.intCompact!=INFLATED) {
2442
long rs = this.intCompact;
2443
if (newScale > oldScale) {
2444
int raise = checkScale((long) newScale - oldScale);
2445
if ((rs = longMultiplyPowerTen(rs, raise)) != INFLATED) {
2446
return valueOf(rs,newScale);
2447
}
2448
BigInteger rb = bigMultiplyPowerTen(raise);
2449
return new BigDecimal(rb, INFLATED, newScale, (precision > 0) ? precision + raise : 0);
2450
} else {
2451
// newScale < oldScale -- drop some digits
2452
// Can't predict the precision due to the effect of rounding.
2453
int drop = checkScale((long) oldScale - newScale);
2454
if (drop < LONG_TEN_POWERS_TABLE.length) {
2455
return divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], newScale, roundingMode, newScale);
2456
} else {
2457
return divideAndRound(this.inflated(), bigTenToThe(drop), newScale, roundingMode, newScale);
2458
}
2459
}
2460
} else {
2461
if (newScale > oldScale) {
2462
int raise = checkScale((long) newScale - oldScale);
2463
BigInteger rb = bigMultiplyPowerTen(this.intVal,raise);
2464
return new BigDecimal(rb, INFLATED, newScale, (precision > 0) ? precision + raise : 0);
2465
} else {
2466
// newScale < oldScale -- drop some digits
2467
// Can't predict the precision due to the effect of rounding.
2468
int drop = checkScale((long) oldScale - newScale);
2469
if (drop < LONG_TEN_POWERS_TABLE.length)
2470
return divideAndRound(this.intVal, LONG_TEN_POWERS_TABLE[drop], newScale, roundingMode,
2471
newScale);
2472
else
2473
return divideAndRound(this.intVal, bigTenToThe(drop), newScale, roundingMode, newScale);
2474
}
2475
}
2476
}
2477
2478
/**
2479
* Returns a {@code BigDecimal} whose scale is the specified
2480
* value, and whose value is numerically equal to this
2481
* {@code BigDecimal}'s. Throws an {@code ArithmeticException}
2482
* if this is not possible.
2483
*
2484
* <p>This call is typically used to increase the scale, in which
2485
* case it is guaranteed that there exists a {@code BigDecimal}
2486
* of the specified scale and the correct value. The call can
2487
* also be used to reduce the scale if the caller knows that the
2488
* {@code BigDecimal} has sufficiently many zeros at the end of
2489
* its fractional part (i.e., factors of ten in its integer value)
2490
* to allow for the rescaling without changing its value.
2491
*
2492
* <p>This method returns the same result as the two-argument
2493
* versions of {@code setScale}, but saves the caller the trouble
2494
* of specifying a rounding mode in cases where it is irrelevant.
2495
*
2496
* <p>Note that since {@code BigDecimal} objects are immutable,
2497
* calls of this method do <i>not</i> result in the original
2498
* object being modified, contrary to the usual convention of
2499
* having methods named <tt>set<i>X</i></tt> mutate field
2500
* <i>{@code X}</i>. Instead, {@code setScale} returns an
2501
* object with the proper scale; the returned object may or may
2502
* not be newly allocated.
2503
*
2504
* @param newScale scale of the {@code BigDecimal} value to be returned.
2505
* @return a {@code BigDecimal} whose scale is the specified value, and
2506
* whose unscaled value is determined by multiplying or dividing
2507
* this {@code BigDecimal}'s unscaled value by the appropriate
2508
* power of ten to maintain its overall value.
2509
* @throws ArithmeticException if the specified scaling operation would
2510
* require rounding.
2511
* @see #setScale(int, int)
2512
* @see #setScale(int, RoundingMode)
2513
*/
2514
public BigDecimal setScale(int newScale) {
2515
return setScale(newScale, ROUND_UNNECESSARY);
2516
}
2517
2518
// Decimal Point Motion Operations
2519
2520
/**
2521
* Returns a {@code BigDecimal} which is equivalent to this one
2522
* with the decimal point moved {@code n} places to the left. If
2523
* {@code n} is non-negative, the call merely adds {@code n} to
2524
* the scale. If {@code n} is negative, the call is equivalent
2525
* to {@code movePointRight(-n)}. The {@code BigDecimal}
2526
* returned by this call has value <tt>(this &times;
2527
* 10<sup>-n</sup>)</tt> and scale {@code max(this.scale()+n,
2528
* 0)}.
2529
*
2530
* @param n number of places to move the decimal point to the left.
2531
* @return a {@code BigDecimal} which is equivalent to this one with the
2532
* decimal point moved {@code n} places to the left.
2533
* @throws ArithmeticException if scale overflows.
2534
*/
2535
public BigDecimal movePointLeft(int n) {
2536
// Cannot use movePointRight(-n) in case of n==Integer.MIN_VALUE
2537
int newScale = checkScale((long)scale + n);
2538
BigDecimal num = new BigDecimal(intVal, intCompact, newScale, 0);
2539
return num.scale < 0 ? num.setScale(0, ROUND_UNNECESSARY) : num;
2540
}
2541
2542
/**
2543
* Returns a {@code BigDecimal} which is equivalent to this one
2544
* with the decimal point moved {@code n} places to the right.
2545
* If {@code n} is non-negative, the call merely subtracts
2546
* {@code n} from the scale. If {@code n} is negative, the call
2547
* is equivalent to {@code movePointLeft(-n)}. The
2548
* {@code BigDecimal} returned by this call has value <tt>(this
2549
* &times; 10<sup>n</sup>)</tt> and scale {@code max(this.scale()-n,
2550
* 0)}.
2551
*
2552
* @param n number of places to move the decimal point to the right.
2553
* @return a {@code BigDecimal} which is equivalent to this one
2554
* with the decimal point moved {@code n} places to the right.
2555
* @throws ArithmeticException if scale overflows.
2556
*/
2557
public BigDecimal movePointRight(int n) {
2558
// Cannot use movePointLeft(-n) in case of n==Integer.MIN_VALUE
2559
int newScale = checkScale((long)scale - n);
2560
BigDecimal num = new BigDecimal(intVal, intCompact, newScale, 0);
2561
return num.scale < 0 ? num.setScale(0, ROUND_UNNECESSARY) : num;
2562
}
2563
2564
/**
2565
* Returns a BigDecimal whose numerical value is equal to
2566
* ({@code this} * 10<sup>n</sup>). The scale of
2567
* the result is {@code (this.scale() - n)}.
2568
*
2569
* @param n the exponent power of ten to scale by
2570
* @return a BigDecimal whose numerical value is equal to
2571
* ({@code this} * 10<sup>n</sup>)
2572
* @throws ArithmeticException if the scale would be
2573
* outside the range of a 32-bit integer.
2574
*
2575
* @since 1.5
2576
*/
2577
public BigDecimal scaleByPowerOfTen(int n) {
2578
return new BigDecimal(intVal, intCompact,
2579
checkScale((long)scale - n), precision);
2580
}
2581
2582
/**
2583
* Returns a {@code BigDecimal} which is numerically equal to
2584
* this one but with any trailing zeros removed from the
2585
* representation. For example, stripping the trailing zeros from
2586
* the {@code BigDecimal} value {@code 600.0}, which has
2587
* [{@code BigInteger}, {@code scale}] components equals to
2588
* [6000, 1], yields {@code 6E2} with [{@code BigInteger},
2589
* {@code scale}] components equals to [6, -2]. If
2590
* this BigDecimal is numerically equal to zero, then
2591
* {@code BigDecimal.ZERO} is returned.
2592
*
2593
* @return a numerically equal {@code BigDecimal} with any
2594
* trailing zeros removed.
2595
* @since 1.5
2596
*/
2597
public BigDecimal stripTrailingZeros() {
2598
if (intCompact == 0 || (intVal != null && intVal.signum() == 0)) {
2599
return BigDecimal.ZERO;
2600
} else if (intCompact != INFLATED) {
2601
return createAndStripZerosToMatchScale(intCompact, scale, Long.MIN_VALUE);
2602
} else {
2603
return createAndStripZerosToMatchScale(intVal, scale, Long.MIN_VALUE);
2604
}
2605
}
2606
2607
// Comparison Operations
2608
2609
/**
2610
* Compares this {@code BigDecimal} with the specified
2611
* {@code BigDecimal}. Two {@code BigDecimal} objects that are
2612
* equal in value but have a different scale (like 2.0 and 2.00)
2613
* are considered equal by this method. This method is provided
2614
* in preference to individual methods for each of the six boolean
2615
* comparison operators ({@literal <}, ==,
2616
* {@literal >}, {@literal >=}, !=, {@literal <=}). The
2617
* suggested idiom for performing these comparisons is:
2618
* {@code (x.compareTo(y)} &lt;<i>op</i>&gt; {@code 0)}, where
2619
* &lt;<i>op</i>&gt; is one of the six comparison operators.
2620
*
2621
* @param val {@code BigDecimal} to which this {@code BigDecimal} is
2622
* to be compared.
2623
* @return -1, 0, or 1 as this {@code BigDecimal} is numerically
2624
* less than, equal to, or greater than {@code val}.
2625
*/
2626
public int compareTo(BigDecimal val) {
2627
// Quick path for equal scale and non-inflated case.
2628
if (scale == val.scale) {
2629
long xs = intCompact;
2630
long ys = val.intCompact;
2631
if (xs != INFLATED && ys != INFLATED)
2632
return xs != ys ? ((xs > ys) ? 1 : -1) : 0;
2633
}
2634
int xsign = this.signum();
2635
int ysign = val.signum();
2636
if (xsign != ysign)
2637
return (xsign > ysign) ? 1 : -1;
2638
if (xsign == 0)
2639
return 0;
2640
int cmp = compareMagnitude(val);
2641
return (xsign > 0) ? cmp : -cmp;
2642
}
2643
2644
/**
2645
* Version of compareTo that ignores sign.
2646
*/
2647
private int compareMagnitude(BigDecimal val) {
2648
// Match scales, avoid unnecessary inflation
2649
long ys = val.intCompact;
2650
long xs = this.intCompact;
2651
if (xs == 0)
2652
return (ys == 0) ? 0 : -1;
2653
if (ys == 0)
2654
return 1;
2655
2656
long sdiff = (long)this.scale - val.scale;
2657
if (sdiff != 0) {
2658
// Avoid matching scales if the (adjusted) exponents differ
2659
long xae = (long)this.precision() - this.scale; // [-1]
2660
long yae = (long)val.precision() - val.scale; // [-1]
2661
if (xae < yae)
2662
return -1;
2663
if (xae > yae)
2664
return 1;
2665
BigInteger rb = null;
2666
if (sdiff < 0) {
2667
// The cases sdiff <= Integer.MIN_VALUE intentionally fall through.
2668
if ( sdiff > Integer.MIN_VALUE &&
2669
(xs == INFLATED ||
2670
(xs = longMultiplyPowerTen(xs, (int)-sdiff)) == INFLATED) &&
2671
ys == INFLATED) {
2672
rb = bigMultiplyPowerTen((int)-sdiff);
2673
return rb.compareMagnitude(val.intVal);
2674
}
2675
} else { // sdiff > 0
2676
// The cases sdiff > Integer.MAX_VALUE intentionally fall through.
2677
if ( sdiff <= Integer.MAX_VALUE &&
2678
(ys == INFLATED ||
2679
(ys = longMultiplyPowerTen(ys, (int)sdiff)) == INFLATED) &&
2680
xs == INFLATED) {
2681
rb = val.bigMultiplyPowerTen((int)sdiff);
2682
return this.intVal.compareMagnitude(rb);
2683
}
2684
}
2685
}
2686
if (xs != INFLATED)
2687
return (ys != INFLATED) ? longCompareMagnitude(xs, ys) : -1;
2688
else if (ys != INFLATED)
2689
return 1;
2690
else
2691
return this.intVal.compareMagnitude(val.intVal);
2692
}
2693
2694
/**
2695
* Compares this {@code BigDecimal} with the specified
2696
* {@code Object} for equality. Unlike {@link
2697
* #compareTo(BigDecimal) compareTo}, this method considers two
2698
* {@code BigDecimal} objects equal only if they are equal in
2699
* value and scale (thus 2.0 is not equal to 2.00 when compared by
2700
* this method).
2701
*
2702
* @param x {@code Object} to which this {@code BigDecimal} is
2703
* to be compared.
2704
* @return {@code true} if and only if the specified {@code Object} is a
2705
* {@code BigDecimal} whose value and scale are equal to this
2706
* {@code BigDecimal}'s.
2707
* @see #compareTo(java.math.BigDecimal)
2708
* @see #hashCode
2709
*/
2710
@Override
2711
public boolean equals(Object x) {
2712
if (!(x instanceof BigDecimal))
2713
return false;
2714
BigDecimal xDec = (BigDecimal) x;
2715
if (x == this)
2716
return true;
2717
if (scale != xDec.scale)
2718
return false;
2719
long s = this.intCompact;
2720
long xs = xDec.intCompact;
2721
if (s != INFLATED) {
2722
if (xs == INFLATED)
2723
xs = compactValFor(xDec.intVal);
2724
return xs == s;
2725
} else if (xs != INFLATED)
2726
return xs == compactValFor(this.intVal);
2727
2728
return this.inflated().equals(xDec.inflated());
2729
}
2730
2731
/**
2732
* Returns the minimum of this {@code BigDecimal} and
2733
* {@code val}.
2734
*
2735
* @param val value with which the minimum is to be computed.
2736
* @return the {@code BigDecimal} whose value is the lesser of this
2737
* {@code BigDecimal} and {@code val}. If they are equal,
2738
* as defined by the {@link #compareTo(BigDecimal) compareTo}
2739
* method, {@code this} is returned.
2740
* @see #compareTo(java.math.BigDecimal)
2741
*/
2742
public BigDecimal min(BigDecimal val) {
2743
return (compareTo(val) <= 0 ? this : val);
2744
}
2745
2746
/**
2747
* Returns the maximum of this {@code BigDecimal} and {@code val}.
2748
*
2749
* @param val value with which the maximum is to be computed.
2750
* @return the {@code BigDecimal} whose value is the greater of this
2751
* {@code BigDecimal} and {@code val}. If they are equal,
2752
* as defined by the {@link #compareTo(BigDecimal) compareTo}
2753
* method, {@code this} is returned.
2754
* @see #compareTo(java.math.BigDecimal)
2755
*/
2756
public BigDecimal max(BigDecimal val) {
2757
return (compareTo(val) >= 0 ? this : val);
2758
}
2759
2760
// Hash Function
2761
2762
/**
2763
* Returns the hash code for this {@code BigDecimal}. Note that
2764
* two {@code BigDecimal} objects that are numerically equal but
2765
* differ in scale (like 2.0 and 2.00) will generally <i>not</i>
2766
* have the same hash code.
2767
*
2768
* @return hash code for this {@code BigDecimal}.
2769
* @see #equals(Object)
2770
*/
2771
@Override
2772
public int hashCode() {
2773
if (intCompact != INFLATED) {
2774
long val2 = (intCompact < 0)? -intCompact : intCompact;
2775
int temp = (int)( ((int)(val2 >>> 32)) * 31 +
2776
(val2 & LONG_MASK));
2777
return 31*((intCompact < 0) ?-temp:temp) + scale;
2778
} else
2779
return 31*intVal.hashCode() + scale;
2780
}
2781
2782
// Format Converters
2783
2784
/**
2785
* Returns the string representation of this {@code BigDecimal},
2786
* using scientific notation if an exponent is needed.
2787
*
2788
* <p>A standard canonical string form of the {@code BigDecimal}
2789
* is created as though by the following steps: first, the
2790
* absolute value of the unscaled value of the {@code BigDecimal}
2791
* is converted to a string in base ten using the characters
2792
* {@code '0'} through {@code '9'} with no leading zeros (except
2793
* if its value is zero, in which case a single {@code '0'}
2794
* character is used).
2795
*
2796
* <p>Next, an <i>adjusted exponent</i> is calculated; this is the
2797
* negated scale, plus the number of characters in the converted
2798
* unscaled value, less one. That is,
2799
* {@code -scale+(ulength-1)}, where {@code ulength} is the
2800
* length of the absolute value of the unscaled value in decimal
2801
* digits (its <i>precision</i>).
2802
*
2803
* <p>If the scale is greater than or equal to zero and the
2804
* adjusted exponent is greater than or equal to {@code -6}, the
2805
* number will be converted to a character form without using
2806
* exponential notation. In this case, if the scale is zero then
2807
* no decimal point is added and if the scale is positive a
2808
* decimal point will be inserted with the scale specifying the
2809
* number of characters to the right of the decimal point.
2810
* {@code '0'} characters are added to the left of the converted
2811
* unscaled value as necessary. If no character precedes the
2812
* decimal point after this insertion then a conventional
2813
* {@code '0'} character is prefixed.
2814
*
2815
* <p>Otherwise (that is, if the scale is negative, or the
2816
* adjusted exponent is less than {@code -6}), the number will be
2817
* converted to a character form using exponential notation. In
2818
* this case, if the converted {@code BigInteger} has more than
2819
* one digit a decimal point is inserted after the first digit.
2820
* An exponent in character form is then suffixed to the converted
2821
* unscaled value (perhaps with inserted decimal point); this
2822
* comprises the letter {@code 'E'} followed immediately by the
2823
* adjusted exponent converted to a character form. The latter is
2824
* in base ten, using the characters {@code '0'} through
2825
* {@code '9'} with no leading zeros, and is always prefixed by a
2826
* sign character {@code '-'} (<tt>'&#92;u002D'</tt>) if the
2827
* adjusted exponent is negative, {@code '+'}
2828
* (<tt>'&#92;u002B'</tt>) otherwise).
2829
*
2830
* <p>Finally, the entire string is prefixed by a minus sign
2831
* character {@code '-'} (<tt>'&#92;u002D'</tt>) if the unscaled
2832
* value is less than zero. No sign character is prefixed if the
2833
* unscaled value is zero or positive.
2834
*
2835
* <p><b>Examples:</b>
2836
* <p>For each representation [<i>unscaled value</i>, <i>scale</i>]
2837
* on the left, the resulting string is shown on the right.
2838
* <pre>
2839
* [123,0] "123"
2840
* [-123,0] "-123"
2841
* [123,-1] "1.23E+3"
2842
* [123,-3] "1.23E+5"
2843
* [123,1] "12.3"
2844
* [123,5] "0.00123"
2845
* [123,10] "1.23E-8"
2846
* [-123,12] "-1.23E-10"
2847
* </pre>
2848
*
2849
* <b>Notes:</b>
2850
* <ol>
2851
*
2852
* <li>There is a one-to-one mapping between the distinguishable
2853
* {@code BigDecimal} values and the result of this conversion.
2854
* That is, every distinguishable {@code BigDecimal} value
2855
* (unscaled value and scale) has a unique string representation
2856
* as a result of using {@code toString}. If that string
2857
* representation is converted back to a {@code BigDecimal} using
2858
* the {@link #BigDecimal(String)} constructor, then the original
2859
* value will be recovered.
2860
*
2861
* <li>The string produced for a given number is always the same;
2862
* it is not affected by locale. This means that it can be used
2863
* as a canonical string representation for exchanging decimal
2864
* data, or as a key for a Hashtable, etc. Locale-sensitive
2865
* number formatting and parsing is handled by the {@link
2866
* java.text.NumberFormat} class and its subclasses.
2867
*
2868
* <li>The {@link #toEngineeringString} method may be used for
2869
* presenting numbers with exponents in engineering notation, and the
2870
* {@link #setScale(int,RoundingMode) setScale} method may be used for
2871
* rounding a {@code BigDecimal} so it has a known number of digits after
2872
* the decimal point.
2873
*
2874
* <li>The digit-to-character mapping provided by
2875
* {@code Character.forDigit} is used.
2876
*
2877
* </ol>
2878
*
2879
* @return string representation of this {@code BigDecimal}.
2880
* @see Character#forDigit
2881
* @see #BigDecimal(java.lang.String)
2882
*/
2883
@Override
2884
public String toString() {
2885
String sc = stringCache;
2886
if (sc == null)
2887
stringCache = sc = layoutChars(true);
2888
return sc;
2889
}
2890
2891
/**
2892
* Returns a string representation of this {@code BigDecimal},
2893
* using engineering notation if an exponent is needed.
2894
*
2895
* <p>Returns a string that represents the {@code BigDecimal} as
2896
* described in the {@link #toString()} method, except that if
2897
* exponential notation is used, the power of ten is adjusted to
2898
* be a multiple of three (engineering notation) such that the
2899
* integer part of nonzero values will be in the range 1 through
2900
* 999. If exponential notation is used for zero values, a
2901
* decimal point and one or two fractional zero digits are used so
2902
* that the scale of the zero value is preserved. Note that
2903
* unlike the output of {@link #toString()}, the output of this
2904
* method is <em>not</em> guaranteed to recover the same [integer,
2905
* scale] pair of this {@code BigDecimal} if the output string is
2906
* converting back to a {@code BigDecimal} using the {@linkplain
2907
* #BigDecimal(String) string constructor}. The result of this method meets
2908
* the weaker constraint of always producing a numerically equal
2909
* result from applying the string constructor to the method's output.
2910
*
2911
* @return string representation of this {@code BigDecimal}, using
2912
* engineering notation if an exponent is needed.
2913
* @since 1.5
2914
*/
2915
public String toEngineeringString() {
2916
return layoutChars(false);
2917
}
2918
2919
/**
2920
* Returns a string representation of this {@code BigDecimal}
2921
* without an exponent field. For values with a positive scale,
2922
* the number of digits to the right of the decimal point is used
2923
* to indicate scale. For values with a zero or negative scale,
2924
* the resulting string is generated as if the value were
2925
* converted to a numerically equal value with zero scale and as
2926
* if all the trailing zeros of the zero scale value were present
2927
* in the result.
2928
*
2929
* The entire string is prefixed by a minus sign character '-'
2930
* (<tt>'&#92;u002D'</tt>) if the unscaled value is less than
2931
* zero. No sign character is prefixed if the unscaled value is
2932
* zero or positive.
2933
*
2934
* Note that if the result of this method is passed to the
2935
* {@linkplain #BigDecimal(String) string constructor}, only the
2936
* numerical value of this {@code BigDecimal} will necessarily be
2937
* recovered; the representation of the new {@code BigDecimal}
2938
* may have a different scale. In particular, if this
2939
* {@code BigDecimal} has a negative scale, the string resulting
2940
* from this method will have a scale of zero when processed by
2941
* the string constructor.
2942
*
2943
* (This method behaves analogously to the {@code toString}
2944
* method in 1.4 and earlier releases.)
2945
*
2946
* @return a string representation of this {@code BigDecimal}
2947
* without an exponent field.
2948
* @since 1.5
2949
* @see #toString()
2950
* @see #toEngineeringString()
2951
*/
2952
public String toPlainString() {
2953
if(scale==0) {
2954
if(intCompact!=INFLATED) {
2955
return Long.toString(intCompact);
2956
} else {
2957
return intVal.toString();
2958
}
2959
}
2960
if(this.scale<0) { // No decimal point
2961
if(signum()==0) {
2962
return "0";
2963
}
2964
int tailingZeros = checkScaleNonZero((-(long)scale));
2965
StringBuilder buf;
2966
if(intCompact!=INFLATED) {
2967
buf = new StringBuilder(20+tailingZeros);
2968
buf.append(intCompact);
2969
} else {
2970
String str = intVal.toString();
2971
buf = new StringBuilder(str.length()+tailingZeros);
2972
buf.append(str);
2973
}
2974
for (int i = 0; i < tailingZeros; i++)
2975
buf.append('0');
2976
return buf.toString();
2977
}
2978
String str ;
2979
if(intCompact!=INFLATED) {
2980
str = Long.toString(Math.abs(intCompact));
2981
} else {
2982
str = intVal.abs().toString();
2983
}
2984
return getValueString(signum(), str, scale);
2985
}
2986
2987
/* Returns a digit.digit string */
2988
private String getValueString(int signum, String intString, int scale) {
2989
/* Insert decimal point */
2990
StringBuilder buf;
2991
int insertionPoint = intString.length() - scale;
2992
if (insertionPoint == 0) { /* Point goes right before intVal */
2993
return (signum<0 ? "-0." : "0.") + intString;
2994
} else if (insertionPoint > 0) { /* Point goes inside intVal */
2995
buf = new StringBuilder(intString);
2996
buf.insert(insertionPoint, '.');
2997
if (signum < 0)
2998
buf.insert(0, '-');
2999
} else { /* We must insert zeros between point and intVal */
3000
buf = new StringBuilder(3-insertionPoint + intString.length());
3001
buf.append(signum<0 ? "-0." : "0.");
3002
for (int i=0; i<-insertionPoint; i++)
3003
buf.append('0');
3004
buf.append(intString);
3005
}
3006
return buf.toString();
3007
}
3008
3009
/**
3010
* Converts this {@code BigDecimal} to a {@code BigInteger}.
3011
* This conversion is analogous to the
3012
* <i>narrowing primitive conversion</i> from {@code double} to
3013
* {@code long} as defined in section 5.1.3 of
3014
* <cite>The Java&trade; Language Specification</cite>:
3015
* any fractional part of this
3016
* {@code BigDecimal} will be discarded. Note that this
3017
* conversion can lose information about the precision of the
3018
* {@code BigDecimal} value.
3019
* <p>
3020
* To have an exception thrown if the conversion is inexact (in
3021
* other words if a nonzero fractional part is discarded), use the
3022
* {@link #toBigIntegerExact()} method.
3023
*
3024
* @return this {@code BigDecimal} converted to a {@code BigInteger}.
3025
*/
3026
public BigInteger toBigInteger() {
3027
// force to an integer, quietly
3028
return this.setScale(0, ROUND_DOWN).inflated();
3029
}
3030
3031
/**
3032
* Converts this {@code BigDecimal} to a {@code BigInteger},
3033
* checking for lost information. An exception is thrown if this
3034
* {@code BigDecimal} has a nonzero fractional part.
3035
*
3036
* @return this {@code BigDecimal} converted to a {@code BigInteger}.
3037
* @throws ArithmeticException if {@code this} has a nonzero
3038
* fractional part.
3039
* @since 1.5
3040
*/
3041
public BigInteger toBigIntegerExact() {
3042
// round to an integer, with Exception if decimal part non-0
3043
return this.setScale(0, ROUND_UNNECESSARY).inflated();
3044
}
3045
3046
/**
3047
* Converts this {@code BigDecimal} to a {@code long}.
3048
* This conversion is analogous to the
3049
* <i>narrowing primitive conversion</i> from {@code double} to
3050
* {@code short} as defined in section 5.1.3 of
3051
* <cite>The Java&trade; Language Specification</cite>:
3052
* any fractional part of this
3053
* {@code BigDecimal} will be discarded, and if the resulting
3054
* "{@code BigInteger}" is too big to fit in a
3055
* {@code long}, only the low-order 64 bits are returned.
3056
* Note that this conversion can lose information about the
3057
* overall magnitude and precision of this {@code BigDecimal} value as well
3058
* as return a result with the opposite sign.
3059
*
3060
* @return this {@code BigDecimal} converted to a {@code long}.
3061
*/
3062
public long longValue(){
3063
if (intCompact != INFLATED && scale == 0) {
3064
return intCompact;
3065
} else {
3066
// Fastpath zero and small values
3067
if (this.signum() == 0 || fractionOnly() ||
3068
// Fastpath very large-scale values that will result
3069
// in a truncated value of zero. If the scale is -64
3070
// or less, there are at least 64 powers of 10 in the
3071
// value of the numerical result. Since 10 = 2*5, in
3072
// that case there would also be 64 powers of 2 in the
3073
// result, meaning all 64 bits of a long will be zero.
3074
scale <= -64) {
3075
return 0;
3076
} else {
3077
return toBigInteger().longValue();
3078
}
3079
}
3080
}
3081
3082
/**
3083
* Return true if a nonzero BigDecimal has an absolute value less
3084
* than one; i.e. only has fraction digits.
3085
*/
3086
private boolean fractionOnly() {
3087
assert this.signum() != 0;
3088
return (this.precision() - this.scale) <= 0;
3089
}
3090
3091
/**
3092
* Converts this {@code BigDecimal} to a {@code long}, checking
3093
* for lost information. If this {@code BigDecimal} has a
3094
* nonzero fractional part or is out of the possible range for a
3095
* {@code long} result then an {@code ArithmeticException} is
3096
* thrown.
3097
*
3098
* @return this {@code BigDecimal} converted to a {@code long}.
3099
* @throws ArithmeticException if {@code this} has a nonzero
3100
* fractional part, or will not fit in a {@code long}.
3101
* @since 1.5
3102
*/
3103
public long longValueExact() {
3104
if (intCompact != INFLATED && scale == 0)
3105
return intCompact;
3106
3107
// Fastpath zero
3108
if (this.signum() == 0)
3109
return 0;
3110
3111
// Fastpath numbers less than 1.0 (the latter can be very slow
3112
// to round if very small)
3113
if (fractionOnly())
3114
throw new ArithmeticException("Rounding necessary");
3115
3116
// If more than 19 digits in integer part it cannot possibly fit
3117
if ((precision() - scale) > 19) // [OK for negative scale too]
3118
throw new java.lang.ArithmeticException("Overflow");
3119
3120
// round to an integer, with Exception if decimal part non-0
3121
BigDecimal num = this.setScale(0, ROUND_UNNECESSARY);
3122
if (num.precision() >= 19) // need to check carefully
3123
LongOverflow.check(num);
3124
return num.inflated().longValue();
3125
}
3126
3127
private static class LongOverflow {
3128
/** BigInteger equal to Long.MIN_VALUE. */
3129
private static final BigInteger LONGMIN = BigInteger.valueOf(Long.MIN_VALUE);
3130
3131
/** BigInteger equal to Long.MAX_VALUE. */
3132
private static final BigInteger LONGMAX = BigInteger.valueOf(Long.MAX_VALUE);
3133
3134
public static void check(BigDecimal num) {
3135
BigInteger intVal = num.inflated();
3136
if (intVal.compareTo(LONGMIN) < 0 ||
3137
intVal.compareTo(LONGMAX) > 0)
3138
throw new java.lang.ArithmeticException("Overflow");
3139
}
3140
}
3141
3142
/**
3143
* Converts this {@code BigDecimal} to an {@code int}.
3144
* This conversion is analogous to the
3145
* <i>narrowing primitive conversion</i> from {@code double} to
3146
* {@code short} as defined in section 5.1.3 of
3147
* <cite>The Java&trade; Language Specification</cite>:
3148
* any fractional part of this
3149
* {@code BigDecimal} will be discarded, and if the resulting
3150
* "{@code BigInteger}" is too big to fit in an
3151
* {@code int}, only the low-order 32 bits are returned.
3152
* Note that this conversion can lose information about the
3153
* overall magnitude and precision of this {@code BigDecimal}
3154
* value as well as return a result with the opposite sign.
3155
*
3156
* @return this {@code BigDecimal} converted to an {@code int}.
3157
*/
3158
public int intValue() {
3159
return (intCompact != INFLATED && scale == 0) ?
3160
(int)intCompact :
3161
(int)longValue();
3162
}
3163
3164
/**
3165
* Converts this {@code BigDecimal} to an {@code int}, checking
3166
* for lost information. If this {@code BigDecimal} has a
3167
* nonzero fractional part or is out of the possible range for an
3168
* {@code int} result then an {@code ArithmeticException} is
3169
* thrown.
3170
*
3171
* @return this {@code BigDecimal} converted to an {@code int}.
3172
* @throws ArithmeticException if {@code this} has a nonzero
3173
* fractional part, or will not fit in an {@code int}.
3174
* @since 1.5
3175
*/
3176
public int intValueExact() {
3177
long num;
3178
num = this.longValueExact(); // will check decimal part
3179
if ((int)num != num)
3180
throw new java.lang.ArithmeticException("Overflow");
3181
return (int)num;
3182
}
3183
3184
/**
3185
* Converts this {@code BigDecimal} to a {@code short}, checking
3186
* for lost information. If this {@code BigDecimal} has a
3187
* nonzero fractional part or is out of the possible range for a
3188
* {@code short} result then an {@code ArithmeticException} is
3189
* thrown.
3190
*
3191
* @return this {@code BigDecimal} converted to a {@code short}.
3192
* @throws ArithmeticException if {@code this} has a nonzero
3193
* fractional part, or will not fit in a {@code short}.
3194
* @since 1.5
3195
*/
3196
public short shortValueExact() {
3197
long num;
3198
num = this.longValueExact(); // will check decimal part
3199
if ((short)num != num)
3200
throw new java.lang.ArithmeticException("Overflow");
3201
return (short)num;
3202
}
3203
3204
/**
3205
* Converts this {@code BigDecimal} to a {@code byte}, checking
3206
* for lost information. If this {@code BigDecimal} has a
3207
* nonzero fractional part or is out of the possible range for a
3208
* {@code byte} result then an {@code ArithmeticException} is
3209
* thrown.
3210
*
3211
* @return this {@code BigDecimal} converted to a {@code byte}.
3212
* @throws ArithmeticException if {@code this} has a nonzero
3213
* fractional part, or will not fit in a {@code byte}.
3214
* @since 1.5
3215
*/
3216
public byte byteValueExact() {
3217
long num;
3218
num = this.longValueExact(); // will check decimal part
3219
if ((byte)num != num)
3220
throw new java.lang.ArithmeticException("Overflow");
3221
return (byte)num;
3222
}
3223
3224
/**
3225
* Converts this {@code BigDecimal} to a {@code float}.
3226
* This conversion is similar to the
3227
* <i>narrowing primitive conversion</i> from {@code double} to
3228
* {@code float} as defined in section 5.1.3 of
3229
* <cite>The Java&trade; Language Specification</cite>:
3230
* if this {@code BigDecimal} has too great a
3231
* magnitude to represent as a {@code float}, it will be
3232
* converted to {@link Float#NEGATIVE_INFINITY} or {@link
3233
* Float#POSITIVE_INFINITY} as appropriate. Note that even when
3234
* the return value is finite, this conversion can lose
3235
* information about the precision of the {@code BigDecimal}
3236
* value.
3237
*
3238
* @return this {@code BigDecimal} converted to a {@code float}.
3239
*/
3240
public float floatValue(){
3241
if(intCompact != INFLATED) {
3242
if (scale == 0) {
3243
return (float)intCompact;
3244
} else {
3245
/*
3246
* If both intCompact and the scale can be exactly
3247
* represented as float values, perform a single float
3248
* multiply or divide to compute the (properly
3249
* rounded) result.
3250
*/
3251
if (Math.abs(intCompact) < 1L<<22 ) {
3252
// Don't have too guard against
3253
// Math.abs(MIN_VALUE) because of outer check
3254
// against INFLATED.
3255
if (scale > 0 && scale < float10pow.length) {
3256
return (float)intCompact / float10pow[scale];
3257
} else if (scale < 0 && scale > -float10pow.length) {
3258
return (float)intCompact * float10pow[-scale];
3259
}
3260
}
3261
}
3262
}
3263
// Somewhat inefficient, but guaranteed to work.
3264
return Float.parseFloat(this.toString());
3265
}
3266
3267
/**
3268
* Converts this {@code BigDecimal} to a {@code double}.
3269
* This conversion is similar to the
3270
* <i>narrowing primitive conversion</i> from {@code double} to
3271
* {@code float} as defined in section 5.1.3 of
3272
* <cite>The Java&trade; Language Specification</cite>:
3273
* if this {@code BigDecimal} has too great a
3274
* magnitude represent as a {@code double}, it will be
3275
* converted to {@link Double#NEGATIVE_INFINITY} or {@link
3276
* Double#POSITIVE_INFINITY} as appropriate. Note that even when
3277
* the return value is finite, this conversion can lose
3278
* information about the precision of the {@code BigDecimal}
3279
* value.
3280
*
3281
* @return this {@code BigDecimal} converted to a {@code double}.
3282
*/
3283
public double doubleValue(){
3284
if(intCompact != INFLATED) {
3285
if (scale == 0) {
3286
return (double)intCompact;
3287
} else {
3288
/*
3289
* If both intCompact and the scale can be exactly
3290
* represented as double values, perform a single
3291
* double multiply or divide to compute the (properly
3292
* rounded) result.
3293
*/
3294
if (Math.abs(intCompact) < 1L<<52 ) {
3295
// Don't have too guard against
3296
// Math.abs(MIN_VALUE) because of outer check
3297
// against INFLATED.
3298
if (scale > 0 && scale < double10pow.length) {
3299
return (double)intCompact / double10pow[scale];
3300
} else if (scale < 0 && scale > -double10pow.length) {
3301
return (double)intCompact * double10pow[-scale];
3302
}
3303
}
3304
}
3305
}
3306
// Somewhat inefficient, but guaranteed to work.
3307
return Double.parseDouble(this.toString());
3308
}
3309
3310
/**
3311
* Powers of 10 which can be represented exactly in {@code
3312
* double}.
3313
*/
3314
private static final double double10pow[] = {
3315
1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5,
3316
1.0e6, 1.0e7, 1.0e8, 1.0e9, 1.0e10, 1.0e11,
3317
1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, 1.0e17,
3318
1.0e18, 1.0e19, 1.0e20, 1.0e21, 1.0e22
3319
};
3320
3321
/**
3322
* Powers of 10 which can be represented exactly in {@code
3323
* float}.
3324
*/
3325
private static final float float10pow[] = {
3326
1.0e0f, 1.0e1f, 1.0e2f, 1.0e3f, 1.0e4f, 1.0e5f,
3327
1.0e6f, 1.0e7f, 1.0e8f, 1.0e9f, 1.0e10f
3328
};
3329
3330
/**
3331
* Returns the size of an ulp, a unit in the last place, of this
3332
* {@code BigDecimal}. An ulp of a nonzero {@code BigDecimal}
3333
* value is the positive distance between this value and the
3334
* {@code BigDecimal} value next larger in magnitude with the
3335
* same number of digits. An ulp of a zero value is numerically
3336
* equal to 1 with the scale of {@code this}. The result is
3337
* stored with the same scale as {@code this} so the result
3338
* for zero and nonzero values is equal to {@code [1,
3339
* this.scale()]}.
3340
*
3341
* @return the size of an ulp of {@code this}
3342
* @since 1.5
3343
*/
3344
public BigDecimal ulp() {
3345
return BigDecimal.valueOf(1, this.scale(), 1);
3346
}
3347
3348
// Private class to build a string representation for BigDecimal object.
3349
// "StringBuilderHelper" is constructed as a thread local variable so it is
3350
// thread safe. The StringBuilder field acts as a buffer to hold the temporary
3351
// representation of BigDecimal. The cmpCharArray holds all the characters for
3352
// the compact representation of BigDecimal (except for '-' sign' if it is
3353
// negative) if its intCompact field is not INFLATED. It is shared by all
3354
// calls to toString() and its variants in that particular thread.
3355
static class StringBuilderHelper {
3356
final StringBuilder sb; // Placeholder for BigDecimal string
3357
final char[] cmpCharArray; // character array to place the intCompact
3358
3359
StringBuilderHelper() {
3360
sb = new StringBuilder();
3361
// All non negative longs can be made to fit into 19 character array.
3362
cmpCharArray = new char[19];
3363
}
3364
3365
// Accessors.
3366
StringBuilder getStringBuilder() {
3367
sb.setLength(0);
3368
return sb;
3369
}
3370
3371
char[] getCompactCharArray() {
3372
return cmpCharArray;
3373
}
3374
3375
/**
3376
* Places characters representing the intCompact in {@code long} into
3377
* cmpCharArray and returns the offset to the array where the
3378
* representation starts.
3379
*
3380
* @param intCompact the number to put into the cmpCharArray.
3381
* @return offset to the array where the representation starts.
3382
* Note: intCompact must be greater or equal to zero.
3383
*/
3384
int putIntCompact(long intCompact) {
3385
assert intCompact >= 0;
3386
3387
long q;
3388
int r;
3389
// since we start from the least significant digit, charPos points to
3390
// the last character in cmpCharArray.
3391
int charPos = cmpCharArray.length;
3392
3393
// Get 2 digits/iteration using longs until quotient fits into an int
3394
while (intCompact > Integer.MAX_VALUE) {
3395
q = intCompact / 100;
3396
r = (int)(intCompact - q * 100);
3397
intCompact = q;
3398
cmpCharArray[--charPos] = DIGIT_ONES[r];
3399
cmpCharArray[--charPos] = DIGIT_TENS[r];
3400
}
3401
3402
// Get 2 digits/iteration using ints when i2 >= 100
3403
int q2;
3404
int i2 = (int)intCompact;
3405
while (i2 >= 100) {
3406
q2 = i2 / 100;
3407
r = i2 - q2 * 100;
3408
i2 = q2;
3409
cmpCharArray[--charPos] = DIGIT_ONES[r];
3410
cmpCharArray[--charPos] = DIGIT_TENS[r];
3411
}
3412
3413
cmpCharArray[--charPos] = DIGIT_ONES[i2];
3414
if (i2 >= 10)
3415
cmpCharArray[--charPos] = DIGIT_TENS[i2];
3416
3417
return charPos;
3418
}
3419
3420
final static char[] DIGIT_TENS = {
3421
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
3422
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
3423
'2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
3424
'3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
3425
'4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
3426
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
3427
'6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
3428
'7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
3429
'8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
3430
'9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
3431
};
3432
3433
final static char[] DIGIT_ONES = {
3434
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3435
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3436
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3437
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3438
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3439
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3440
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3441
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3442
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3443
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3444
};
3445
}
3446
3447
/**
3448
* Lay out this {@code BigDecimal} into a {@code char[]} array.
3449
* The Java 1.2 equivalent to this was called {@code getValueString}.
3450
*
3451
* @param sci {@code true} for Scientific exponential notation;
3452
* {@code false} for Engineering
3453
* @return string with canonical string representation of this
3454
* {@code BigDecimal}
3455
*/
3456
private String layoutChars(boolean sci) {
3457
if (scale == 0) // zero scale is trivial
3458
return (intCompact != INFLATED) ?
3459
Long.toString(intCompact):
3460
intVal.toString();
3461
if (scale == 2 &&
3462
intCompact >= 0 && intCompact < Integer.MAX_VALUE) {
3463
// currency fast path
3464
int lowInt = (int)intCompact % 100;
3465
int highInt = (int)intCompact / 100;
3466
return (Integer.toString(highInt) + '.' +
3467
StringBuilderHelper.DIGIT_TENS[lowInt] +
3468
StringBuilderHelper.DIGIT_ONES[lowInt]) ;
3469
}
3470
3471
StringBuilderHelper sbHelper = threadLocalStringBuilderHelper.get();
3472
char[] coeff;
3473
int offset; // offset is the starting index for coeff array
3474
// Get the significand as an absolute value
3475
if (intCompact != INFLATED) {
3476
offset = sbHelper.putIntCompact(Math.abs(intCompact));
3477
coeff = sbHelper.getCompactCharArray();
3478
} else {
3479
offset = 0;
3480
coeff = intVal.abs().toString().toCharArray();
3481
}
3482
3483
// Construct a buffer, with sufficient capacity for all cases.
3484
// If E-notation is needed, length will be: +1 if negative, +1
3485
// if '.' needed, +2 for "E+", + up to 10 for adjusted exponent.
3486
// Otherwise it could have +1 if negative, plus leading "0.00000"
3487
StringBuilder buf = sbHelper.getStringBuilder();
3488
if (signum() < 0) // prefix '-' if negative
3489
buf.append('-');
3490
int coeffLen = coeff.length - offset;
3491
long adjusted = -(long)scale + (coeffLen -1);
3492
if ((scale >= 0) && (adjusted >= -6)) { // plain number
3493
int pad = scale - coeffLen; // count of padding zeros
3494
if (pad >= 0) { // 0.xxx form
3495
buf.append('0');
3496
buf.append('.');
3497
for (; pad>0; pad--) {
3498
buf.append('0');
3499
}
3500
buf.append(coeff, offset, coeffLen);
3501
} else { // xx.xx form
3502
buf.append(coeff, offset, -pad);
3503
buf.append('.');
3504
buf.append(coeff, -pad + offset, scale);
3505
}
3506
} else { // E-notation is needed
3507
if (sci) { // Scientific notation
3508
buf.append(coeff[offset]); // first character
3509
if (coeffLen > 1) { // more to come
3510
buf.append('.');
3511
buf.append(coeff, offset + 1, coeffLen - 1);
3512
}
3513
} else { // Engineering notation
3514
int sig = (int)(adjusted % 3);
3515
if (sig < 0)
3516
sig += 3; // [adjusted was negative]
3517
adjusted -= sig; // now a multiple of 3
3518
sig++;
3519
if (signum() == 0) {
3520
switch (sig) {
3521
case 1:
3522
buf.append('0'); // exponent is a multiple of three
3523
break;
3524
case 2:
3525
buf.append("0.00");
3526
adjusted += 3;
3527
break;
3528
case 3:
3529
buf.append("0.0");
3530
adjusted += 3;
3531
break;
3532
default:
3533
throw new AssertionError("Unexpected sig value " + sig);
3534
}
3535
} else if (sig >= coeffLen) { // significand all in integer
3536
buf.append(coeff, offset, coeffLen);
3537
// may need some zeros, too
3538
for (int i = sig - coeffLen; i > 0; i--)
3539
buf.append('0');
3540
} else { // xx.xxE form
3541
buf.append(coeff, offset, sig);
3542
buf.append('.');
3543
buf.append(coeff, offset + sig, coeffLen - sig);
3544
}
3545
}
3546
if (adjusted != 0) { // [!sci could have made 0]
3547
buf.append('E');
3548
if (adjusted > 0) // force sign for positive
3549
buf.append('+');
3550
buf.append(adjusted);
3551
}
3552
}
3553
return buf.toString();
3554
}
3555
3556
/**
3557
* Return 10 to the power n, as a {@code BigInteger}.
3558
*
3559
* @param n the power of ten to be returned (>=0)
3560
* @return a {@code BigInteger} with the value (10<sup>n</sup>)
3561
*/
3562
private static BigInteger bigTenToThe(int n) {
3563
if (n < 0)
3564
return BigInteger.ZERO;
3565
3566
if (n < BIG_TEN_POWERS_TABLE_MAX) {
3567
BigInteger[] pows = BIG_TEN_POWERS_TABLE;
3568
if (n < pows.length)
3569
return pows[n];
3570
else
3571
return expandBigIntegerTenPowers(n);
3572
}
3573
3574
return BigInteger.TEN.pow(n);
3575
}
3576
3577
/**
3578
* Expand the BIG_TEN_POWERS_TABLE array to contain at least 10**n.
3579
*
3580
* @param n the power of ten to be returned (>=0)
3581
* @return a {@code BigDecimal} with the value (10<sup>n</sup>) and
3582
* in the meantime, the BIG_TEN_POWERS_TABLE array gets
3583
* expanded to the size greater than n.
3584
*/
3585
private static BigInteger expandBigIntegerTenPowers(int n) {
3586
synchronized(BigDecimal.class) {
3587
BigInteger[] pows = BIG_TEN_POWERS_TABLE;
3588
int curLen = pows.length;
3589
// The following comparison and the above synchronized statement is
3590
// to prevent multiple threads from expanding the same array.
3591
if (curLen <= n) {
3592
int newLen = curLen << 1;
3593
while (newLen <= n)
3594
newLen <<= 1;
3595
pows = Arrays.copyOf(pows, newLen);
3596
for (int i = curLen; i < newLen; i++)
3597
pows[i] = pows[i - 1].multiply(BigInteger.TEN);
3598
// Based on the following facts:
3599
// 1. pows is a private local varible;
3600
// 2. the following store is a volatile store.
3601
// the newly created array elements can be safely published.
3602
BIG_TEN_POWERS_TABLE = pows;
3603
}
3604
return pows[n];
3605
}
3606
}
3607
3608
private static final long[] LONG_TEN_POWERS_TABLE = {
3609
1, // 0 / 10^0
3610
10, // 1 / 10^1
3611
100, // 2 / 10^2
3612
1000, // 3 / 10^3
3613
10000, // 4 / 10^4
3614
100000, // 5 / 10^5
3615
1000000, // 6 / 10^6
3616
10000000, // 7 / 10^7
3617
100000000, // 8 / 10^8
3618
1000000000, // 9 / 10^9
3619
10000000000L, // 10 / 10^10
3620
100000000000L, // 11 / 10^11
3621
1000000000000L, // 12 / 10^12
3622
10000000000000L, // 13 / 10^13
3623
100000000000000L, // 14 / 10^14
3624
1000000000000000L, // 15 / 10^15
3625
10000000000000000L, // 16 / 10^16
3626
100000000000000000L, // 17 / 10^17
3627
1000000000000000000L // 18 / 10^18
3628
};
3629
3630
private static volatile BigInteger BIG_TEN_POWERS_TABLE[] = {
3631
BigInteger.ONE,
3632
BigInteger.valueOf(10),
3633
BigInteger.valueOf(100),
3634
BigInteger.valueOf(1000),
3635
BigInteger.valueOf(10000),
3636
BigInteger.valueOf(100000),
3637
BigInteger.valueOf(1000000),
3638
BigInteger.valueOf(10000000),
3639
BigInteger.valueOf(100000000),
3640
BigInteger.valueOf(1000000000),
3641
BigInteger.valueOf(10000000000L),
3642
BigInteger.valueOf(100000000000L),
3643
BigInteger.valueOf(1000000000000L),
3644
BigInteger.valueOf(10000000000000L),
3645
BigInteger.valueOf(100000000000000L),
3646
BigInteger.valueOf(1000000000000000L),
3647
BigInteger.valueOf(10000000000000000L),
3648
BigInteger.valueOf(100000000000000000L),
3649
BigInteger.valueOf(1000000000000000000L)
3650
};
3651
3652
private static final int BIG_TEN_POWERS_TABLE_INITLEN =
3653
BIG_TEN_POWERS_TABLE.length;
3654
private static final int BIG_TEN_POWERS_TABLE_MAX =
3655
16 * BIG_TEN_POWERS_TABLE_INITLEN;
3656
3657
private static final long THRESHOLDS_TABLE[] = {
3658
Long.MAX_VALUE, // 0
3659
Long.MAX_VALUE/10L, // 1
3660
Long.MAX_VALUE/100L, // 2
3661
Long.MAX_VALUE/1000L, // 3
3662
Long.MAX_VALUE/10000L, // 4
3663
Long.MAX_VALUE/100000L, // 5
3664
Long.MAX_VALUE/1000000L, // 6
3665
Long.MAX_VALUE/10000000L, // 7
3666
Long.MAX_VALUE/100000000L, // 8
3667
Long.MAX_VALUE/1000000000L, // 9
3668
Long.MAX_VALUE/10000000000L, // 10
3669
Long.MAX_VALUE/100000000000L, // 11
3670
Long.MAX_VALUE/1000000000000L, // 12
3671
Long.MAX_VALUE/10000000000000L, // 13
3672
Long.MAX_VALUE/100000000000000L, // 14
3673
Long.MAX_VALUE/1000000000000000L, // 15
3674
Long.MAX_VALUE/10000000000000000L, // 16
3675
Long.MAX_VALUE/100000000000000000L, // 17
3676
Long.MAX_VALUE/1000000000000000000L // 18
3677
};
3678
3679
/**
3680
* Compute val * 10 ^ n; return this product if it is
3681
* representable as a long, INFLATED otherwise.
3682
*/
3683
private static long longMultiplyPowerTen(long val, int n) {
3684
if (val == 0 || n <= 0)
3685
return val;
3686
long[] tab = LONG_TEN_POWERS_TABLE;
3687
long[] bounds = THRESHOLDS_TABLE;
3688
if (n < tab.length && n < bounds.length) {
3689
long tenpower = tab[n];
3690
if (val == 1)
3691
return tenpower;
3692
if (Math.abs(val) <= bounds[n])
3693
return val * tenpower;
3694
}
3695
return INFLATED;
3696
}
3697
3698
/**
3699
* Compute this * 10 ^ n.
3700
* Needed mainly to allow special casing to trap zero value
3701
*/
3702
private BigInteger bigMultiplyPowerTen(int n) {
3703
if (n <= 0)
3704
return this.inflated();
3705
3706
if (intCompact != INFLATED)
3707
return bigTenToThe(n).multiply(intCompact);
3708
else
3709
return intVal.multiply(bigTenToThe(n));
3710
}
3711
3712
/**
3713
* Returns appropriate BigInteger from intVal field if intVal is
3714
* null, i.e. the compact representation is in use.
3715
*/
3716
private BigInteger inflated() {
3717
if (intVal == null) {
3718
return BigInteger.valueOf(intCompact);
3719
}
3720
return intVal;
3721
}
3722
3723
/**
3724
* Match the scales of two {@code BigDecimal}s to align their
3725
* least significant digits.
3726
*
3727
* <p>If the scales of val[0] and val[1] differ, rescale
3728
* (non-destructively) the lower-scaled {@code BigDecimal} so
3729
* they match. That is, the lower-scaled reference will be
3730
* replaced by a reference to a new object with the same scale as
3731
* the other {@code BigDecimal}.
3732
*
3733
* @param val array of two elements referring to the two
3734
* {@code BigDecimal}s to be aligned.
3735
*/
3736
private static void matchScale(BigDecimal[] val) {
3737
if (val[0].scale == val[1].scale) {
3738
return;
3739
} else if (val[0].scale < val[1].scale) {
3740
val[0] = val[0].setScale(val[1].scale, ROUND_UNNECESSARY);
3741
} else if (val[1].scale < val[0].scale) {
3742
val[1] = val[1].setScale(val[0].scale, ROUND_UNNECESSARY);
3743
}
3744
}
3745
3746
private static class UnsafeHolder {
3747
private static final sun.misc.Unsafe unsafe;
3748
private static final long intCompactOffset;
3749
private static final long intValOffset;
3750
static {
3751
try {
3752
unsafe = sun.misc.Unsafe.getUnsafe();
3753
intCompactOffset = unsafe.objectFieldOffset
3754
(BigDecimal.class.getDeclaredField("intCompact"));
3755
intValOffset = unsafe.objectFieldOffset
3756
(BigDecimal.class.getDeclaredField("intVal"));
3757
} catch (Exception ex) {
3758
throw new ExceptionInInitializerError(ex);
3759
}
3760
}
3761
static void setIntCompactVolatile(BigDecimal bd, long val) {
3762
unsafe.putLongVolatile(bd, intCompactOffset, val);
3763
}
3764
3765
static void setIntValVolatile(BigDecimal bd, BigInteger val) {
3766
unsafe.putObjectVolatile(bd, intValOffset, val);
3767
}
3768
}
3769
3770
/**
3771
* Reconstitute the {@code BigDecimal} instance from a stream (that is,
3772
* deserialize it).
3773
*
3774
* @param s the stream being read.
3775
*/
3776
private void readObject(java.io.ObjectInputStream s)
3777
throws java.io.IOException, ClassNotFoundException {
3778
// Read in all fields
3779
s.defaultReadObject();
3780
// validate possibly bad fields
3781
if (intVal == null) {
3782
String message = "BigDecimal: null intVal in stream";
3783
throw new java.io.StreamCorruptedException(message);
3784
// [all values of scale are now allowed]
3785
}
3786
UnsafeHolder.setIntCompactVolatile(this, compactValFor(intVal));
3787
}
3788
3789
/**
3790
* Serialize this {@code BigDecimal} to the stream in question
3791
*
3792
* @param s the stream to serialize to.
3793
*/
3794
private void writeObject(java.io.ObjectOutputStream s)
3795
throws java.io.IOException {
3796
// Must inflate to maintain compatible serial form.
3797
if (this.intVal == null)
3798
UnsafeHolder.setIntValVolatile(this, BigInteger.valueOf(this.intCompact));
3799
// Could reset intVal back to null if it has to be set.
3800
s.defaultWriteObject();
3801
}
3802
3803
/**
3804
* Returns the length of the absolute value of a {@code long}, in decimal
3805
* digits.
3806
*
3807
* @param x the {@code long}
3808
* @return the length of the unscaled value, in deciaml digits.
3809
*/
3810
static int longDigitLength(long x) {
3811
/*
3812
* As described in "Bit Twiddling Hacks" by Sean Anderson,
3813
* (http://graphics.stanford.edu/~seander/bithacks.html)
3814
* integer log 10 of x is within 1 of (1233/4096)* (1 +
3815
* integer log 2 of x). The fraction 1233/4096 approximates
3816
* log10(2). So we first do a version of log2 (a variant of
3817
* Long class with pre-checks and opposite directionality) and
3818
* then scale and check against powers table. This is a little
3819
* simpler in present context than the version in Hacker's
3820
* Delight sec 11-4. Adding one to bit length allows comparing
3821
* downward from the LONG_TEN_POWERS_TABLE that we need
3822
* anyway.
3823
*/
3824
assert x != BigDecimal.INFLATED;
3825
if (x < 0)
3826
x = -x;
3827
if (x < 10) // must screen for 0, might as well 10
3828
return 1;
3829
int r = ((64 - Long.numberOfLeadingZeros(x) + 1) * 1233) >>> 12;
3830
long[] tab = LONG_TEN_POWERS_TABLE;
3831
// if r >= length, must have max possible digits for long
3832
return (r >= tab.length || x < tab[r]) ? r : r + 1;
3833
}
3834
3835
/**
3836
* Returns the length of the absolute value of a BigInteger, in
3837
* decimal digits.
3838
*
3839
* @param b the BigInteger
3840
* @return the length of the unscaled value, in decimal digits
3841
*/
3842
private static int bigDigitLength(BigInteger b) {
3843
/*
3844
* Same idea as the long version, but we need a better
3845
* approximation of log10(2). Using 646456993/2^31
3846
* is accurate up to max possible reported bitLength.
3847
*/
3848
if (b.signum == 0)
3849
return 1;
3850
int r = (int)((((long)b.bitLength() + 1) * 646456993) >>> 31);
3851
return b.compareMagnitude(bigTenToThe(r)) < 0? r : r+1;
3852
}
3853
3854
/**
3855
* Check a scale for Underflow or Overflow. If this BigDecimal is
3856
* nonzero, throw an exception if the scale is outof range. If this
3857
* is zero, saturate the scale to the extreme value of the right
3858
* sign if the scale is out of range.
3859
*
3860
* @param val The new scale.
3861
* @throws ArithmeticException (overflow or underflow) if the new
3862
* scale is out of range.
3863
* @return validated scale as an int.
3864
*/
3865
private int checkScale(long val) {
3866
int asInt = (int)val;
3867
if (asInt != val) {
3868
asInt = val>Integer.MAX_VALUE ? Integer.MAX_VALUE : Integer.MIN_VALUE;
3869
BigInteger b;
3870
if (intCompact != 0 &&
3871
((b = intVal) == null || b.signum() != 0))
3872
throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
3873
}
3874
return asInt;
3875
}
3876
3877
/**
3878
* Returns the compact value for given {@code BigInteger}, or
3879
* INFLATED if too big. Relies on internal representation of
3880
* {@code BigInteger}.
3881
*/
3882
private static long compactValFor(BigInteger b) {
3883
int[] m = b.mag;
3884
int len = m.length;
3885
if (len == 0)
3886
return 0;
3887
int d = m[0];
3888
if (len > 2 || (len == 2 && d < 0))
3889
return INFLATED;
3890
3891
long u = (len == 2)?
3892
(((long) m[1] & LONG_MASK) + (((long)d) << 32)) :
3893
(((long)d) & LONG_MASK);
3894
return (b.signum < 0)? -u : u;
3895
}
3896
3897
private static int longCompareMagnitude(long x, long y) {
3898
if (x < 0)
3899
x = -x;
3900
if (y < 0)
3901
y = -y;
3902
return (x < y) ? -1 : ((x == y) ? 0 : 1);
3903
}
3904
3905
private static int saturateLong(long s) {
3906
int i = (int)s;
3907
return (s == i) ? i : (s < 0 ? Integer.MIN_VALUE : Integer.MAX_VALUE);
3908
}
3909
3910
/*
3911
* Internal printing routine
3912
*/
3913
private static void print(String name, BigDecimal bd) {
3914
System.err.format("%s:\tintCompact %d\tintVal %d\tscale %d\tprecision %d%n",
3915
name,
3916
bd.intCompact,
3917
bd.intVal,
3918
bd.scale,
3919
bd.precision);
3920
}
3921
3922
/**
3923
* Check internal invariants of this BigDecimal. These invariants
3924
* include:
3925
*
3926
* <ul>
3927
*
3928
* <li>The object must be initialized; either intCompact must not be
3929
* INFLATED or intVal is non-null. Both of these conditions may
3930
* be true.
3931
*
3932
* <li>If both intCompact and intVal and set, their values must be
3933
* consistent.
3934
*
3935
* <li>If precision is nonzero, it must have the right value.
3936
* </ul>
3937
*
3938
* Note: Since this is an audit method, we are not supposed to change the
3939
* state of this BigDecimal object.
3940
*/
3941
private BigDecimal audit() {
3942
if (intCompact == INFLATED) {
3943
if (intVal == null) {
3944
print("audit", this);
3945
throw new AssertionError("null intVal");
3946
}
3947
// Check precision
3948
if (precision > 0 && precision != bigDigitLength(intVal)) {
3949
print("audit", this);
3950
throw new AssertionError("precision mismatch");
3951
}
3952
} else {
3953
if (intVal != null) {
3954
long val = intVal.longValue();
3955
if (val != intCompact) {
3956
print("audit", this);
3957
throw new AssertionError("Inconsistent state, intCompact=" +
3958
intCompact + "\t intVal=" + val);
3959
}
3960
}
3961
// Check precision
3962
if (precision > 0 && precision != longDigitLength(intCompact)) {
3963
print("audit", this);
3964
throw new AssertionError("precision mismatch");
3965
}
3966
}
3967
return this;
3968
}
3969
3970
/* the same as checkScale where value!=0 */
3971
private static int checkScaleNonZero(long val) {
3972
int asInt = (int)val;
3973
if (asInt != val) {
3974
throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
3975
}
3976
return asInt;
3977
}
3978
3979
private static int checkScale(long intCompact, long val) {
3980
int asInt = (int)val;
3981
if (asInt != val) {
3982
asInt = val>Integer.MAX_VALUE ? Integer.MAX_VALUE : Integer.MIN_VALUE;
3983
if (intCompact != 0)
3984
throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
3985
}
3986
return asInt;
3987
}
3988
3989
private static int checkScale(BigInteger intVal, long val) {
3990
int asInt = (int)val;
3991
if (asInt != val) {
3992
asInt = val>Integer.MAX_VALUE ? Integer.MAX_VALUE : Integer.MIN_VALUE;
3993
if (intVal.signum() != 0)
3994
throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
3995
}
3996
return asInt;
3997
}
3998
3999
/**
4000
* Returns a {@code BigDecimal} rounded according to the MathContext
4001
* settings;
4002
* If rounding is needed a new {@code BigDecimal} is created and returned.
4003
*
4004
* @param val the value to be rounded
4005
* @param mc the context to use.
4006
* @return a {@code BigDecimal} rounded according to the MathContext
4007
* settings. May return {@code value}, if no rounding needed.
4008
* @throws ArithmeticException if the rounding mode is
4009
* {@code RoundingMode.UNNECESSARY} and the
4010
* result is inexact.
4011
*/
4012
private static BigDecimal doRound(BigDecimal val, MathContext mc) {
4013
int mcp = mc.precision;
4014
boolean wasDivided = false;
4015
if (mcp > 0) {
4016
BigInteger intVal = val.intVal;
4017
long compactVal = val.intCompact;
4018
int scale = val.scale;
4019
int prec = val.precision();
4020
int mode = mc.roundingMode.oldMode;
4021
int drop;
4022
if (compactVal == INFLATED) {
4023
drop = prec - mcp;
4024
while (drop > 0) {
4025
scale = checkScaleNonZero((long) scale - drop);
4026
intVal = divideAndRoundByTenPow(intVal, drop, mode);
4027
wasDivided = true;
4028
compactVal = compactValFor(intVal);
4029
if (compactVal != INFLATED) {
4030
prec = longDigitLength(compactVal);
4031
break;
4032
}
4033
prec = bigDigitLength(intVal);
4034
drop = prec - mcp;
4035
}
4036
}
4037
if (compactVal != INFLATED) {
4038
drop = prec - mcp; // drop can't be more than 18
4039
while (drop > 0) {
4040
scale = checkScaleNonZero((long) scale - drop);
4041
compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
4042
wasDivided = true;
4043
prec = longDigitLength(compactVal);
4044
drop = prec - mcp;
4045
intVal = null;
4046
}
4047
}
4048
return wasDivided ? new BigDecimal(intVal,compactVal,scale,prec) : val;
4049
}
4050
return val;
4051
}
4052
4053
/*
4054
* Returns a {@code BigDecimal} created from {@code long} value with
4055
* given scale rounded according to the MathContext settings
4056
*/
4057
private static BigDecimal doRound(long compactVal, int scale, MathContext mc) {
4058
int mcp = mc.precision;
4059
if (mcp > 0 && mcp < 19) {
4060
int prec = longDigitLength(compactVal);
4061
int drop = prec - mcp; // drop can't be more than 18
4062
while (drop > 0) {
4063
scale = checkScaleNonZero((long) scale - drop);
4064
compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
4065
prec = longDigitLength(compactVal);
4066
drop = prec - mcp;
4067
}
4068
return valueOf(compactVal, scale, prec);
4069
}
4070
return valueOf(compactVal, scale);
4071
}
4072
4073
/*
4074
* Returns a {@code BigDecimal} created from {@code BigInteger} value with
4075
* given scale rounded according to the MathContext settings
4076
*/
4077
private static BigDecimal doRound(BigInteger intVal, int scale, MathContext mc) {
4078
int mcp = mc.precision;
4079
int prec = 0;
4080
if (mcp > 0) {
4081
long compactVal = compactValFor(intVal);
4082
int mode = mc.roundingMode.oldMode;
4083
int drop;
4084
if (compactVal == INFLATED) {
4085
prec = bigDigitLength(intVal);
4086
drop = prec - mcp;
4087
while (drop > 0) {
4088
scale = checkScaleNonZero((long) scale - drop);
4089
intVal = divideAndRoundByTenPow(intVal, drop, mode);
4090
compactVal = compactValFor(intVal);
4091
if (compactVal != INFLATED) {
4092
break;
4093
}
4094
prec = bigDigitLength(intVal);
4095
drop = prec - mcp;
4096
}
4097
}
4098
if (compactVal != INFLATED) {
4099
prec = longDigitLength(compactVal);
4100
drop = prec - mcp; // drop can't be more than 18
4101
while (drop > 0) {
4102
scale = checkScaleNonZero((long) scale - drop);
4103
compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
4104
prec = longDigitLength(compactVal);
4105
drop = prec - mcp;
4106
}
4107
return valueOf(compactVal,scale,prec);
4108
}
4109
}
4110
return new BigDecimal(intVal,INFLATED,scale,prec);
4111
}
4112
4113
/*
4114
* Divides {@code BigInteger} value by ten power.
4115
*/
4116
private static BigInteger divideAndRoundByTenPow(BigInteger intVal, int tenPow, int roundingMode) {
4117
if (tenPow < LONG_TEN_POWERS_TABLE.length)
4118
intVal = divideAndRound(intVal, LONG_TEN_POWERS_TABLE[tenPow], roundingMode);
4119
else
4120
intVal = divideAndRound(intVal, bigTenToThe(tenPow), roundingMode);
4121
return intVal;
4122
}
4123
4124
/**
4125
* Internally used for division operation for division {@code long} by
4126
* {@code long}.
4127
* The returned {@code BigDecimal} object is the quotient whose scale is set
4128
* to the passed in scale. If the remainder is not zero, it will be rounded
4129
* based on the passed in roundingMode. Also, if the remainder is zero and
4130
* the last parameter, i.e. preferredScale is NOT equal to scale, the
4131
* trailing zeros of the result is stripped to match the preferredScale.
4132
*/
4133
private static BigDecimal divideAndRound(long ldividend, long ldivisor, int scale, int roundingMode,
4134
int preferredScale) {
4135
4136
int qsign; // quotient sign
4137
long q = ldividend / ldivisor; // store quotient in long
4138
if (roundingMode == ROUND_DOWN && scale == preferredScale)
4139
return valueOf(q, scale);
4140
long r = ldividend % ldivisor; // store remainder in long
4141
qsign = ((ldividend < 0) == (ldivisor < 0)) ? 1 : -1;
4142
if (r != 0) {
4143
boolean increment = needIncrement(ldivisor, roundingMode, qsign, q, r);
4144
return valueOf((increment ? q + qsign : q), scale);
4145
} else {
4146
if (preferredScale != scale)
4147
return createAndStripZerosToMatchScale(q, scale, preferredScale);
4148
else
4149
return valueOf(q, scale);
4150
}
4151
}
4152
4153
/**
4154
* Divides {@code long} by {@code long} and do rounding based on the
4155
* passed in roundingMode.
4156
*/
4157
private static long divideAndRound(long ldividend, long ldivisor, int roundingMode) {
4158
int qsign; // quotient sign
4159
long q = ldividend / ldivisor; // store quotient in long
4160
if (roundingMode == ROUND_DOWN)
4161
return q;
4162
long r = ldividend % ldivisor; // store remainder in long
4163
qsign = ((ldividend < 0) == (ldivisor < 0)) ? 1 : -1;
4164
if (r != 0) {
4165
boolean increment = needIncrement(ldivisor, roundingMode, qsign, q, r);
4166
return increment ? q + qsign : q;
4167
} else {
4168
return q;
4169
}
4170
}
4171
4172
/**
4173
* Shared logic of need increment computation.
4174
*/
4175
private static boolean commonNeedIncrement(int roundingMode, int qsign,
4176
int cmpFracHalf, boolean oddQuot) {
4177
switch(roundingMode) {
4178
case ROUND_UNNECESSARY:
4179
throw new ArithmeticException("Rounding necessary");
4180
4181
case ROUND_UP: // Away from zero
4182
return true;
4183
4184
case ROUND_DOWN: // Towards zero
4185
return false;
4186
4187
case ROUND_CEILING: // Towards +infinity
4188
return qsign > 0;
4189
4190
case ROUND_FLOOR: // Towards -infinity
4191
return qsign < 0;
4192
4193
default: // Some kind of half-way rounding
4194
assert roundingMode >= ROUND_HALF_UP &&
4195
roundingMode <= ROUND_HALF_EVEN: "Unexpected rounding mode" + RoundingMode.valueOf(roundingMode);
4196
4197
if (cmpFracHalf < 0 ) // We're closer to higher digit
4198
return false;
4199
else if (cmpFracHalf > 0 ) // We're closer to lower digit
4200
return true;
4201
else { // half-way
4202
assert cmpFracHalf == 0;
4203
4204
switch(roundingMode) {
4205
case ROUND_HALF_DOWN:
4206
return false;
4207
4208
case ROUND_HALF_UP:
4209
return true;
4210
4211
case ROUND_HALF_EVEN:
4212
return oddQuot;
4213
4214
default:
4215
throw new AssertionError("Unexpected rounding mode" + roundingMode);
4216
}
4217
}
4218
}
4219
}
4220
4221
/**
4222
* Tests if quotient has to be incremented according the roundingMode
4223
*/
4224
private static boolean needIncrement(long ldivisor, int roundingMode,
4225
int qsign, long q, long r) {
4226
assert r != 0L;
4227
4228
int cmpFracHalf;
4229
if (r <= HALF_LONG_MIN_VALUE || r > HALF_LONG_MAX_VALUE) {
4230
cmpFracHalf = 1; // 2 * r can't fit into long
4231
} else {
4232
cmpFracHalf = longCompareMagnitude(2 * r, ldivisor);
4233
}
4234
4235
return commonNeedIncrement(roundingMode, qsign, cmpFracHalf, (q & 1L) != 0L);
4236
}
4237
4238
/**
4239
* Divides {@code BigInteger} value by {@code long} value and
4240
* do rounding based on the passed in roundingMode.
4241
*/
4242
private static BigInteger divideAndRound(BigInteger bdividend, long ldivisor, int roundingMode) {
4243
boolean isRemainderZero; // record remainder is zero or not
4244
int qsign; // quotient sign
4245
long r = 0; // store quotient & remainder in long
4246
MutableBigInteger mq = null; // store quotient
4247
// Descend into mutables for faster remainder checks
4248
MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4249
mq = new MutableBigInteger();
4250
r = mdividend.divide(ldivisor, mq);
4251
isRemainderZero = (r == 0);
4252
qsign = (ldivisor < 0) ? -bdividend.signum : bdividend.signum;
4253
if (!isRemainderZero) {
4254
if(needIncrement(ldivisor, roundingMode, qsign, mq, r)) {
4255
mq.add(MutableBigInteger.ONE);
4256
}
4257
}
4258
return mq.toBigInteger(qsign);
4259
}
4260
4261
/**
4262
* Internally used for division operation for division {@code BigInteger}
4263
* by {@code long}.
4264
* The returned {@code BigDecimal} object is the quotient whose scale is set
4265
* to the passed in scale. If the remainder is not zero, it will be rounded
4266
* based on the passed in roundingMode. Also, if the remainder is zero and
4267
* the last parameter, i.e. preferredScale is NOT equal to scale, the
4268
* trailing zeros of the result is stripped to match the preferredScale.
4269
*/
4270
private static BigDecimal divideAndRound(BigInteger bdividend,
4271
long ldivisor, int scale, int roundingMode, int preferredScale) {
4272
boolean isRemainderZero; // record remainder is zero or not
4273
int qsign; // quotient sign
4274
long r = 0; // store quotient & remainder in long
4275
MutableBigInteger mq = null; // store quotient
4276
// Descend into mutables for faster remainder checks
4277
MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4278
mq = new MutableBigInteger();
4279
r = mdividend.divide(ldivisor, mq);
4280
isRemainderZero = (r == 0);
4281
qsign = (ldivisor < 0) ? -bdividend.signum : bdividend.signum;
4282
if (!isRemainderZero) {
4283
if(needIncrement(ldivisor, roundingMode, qsign, mq, r)) {
4284
mq.add(MutableBigInteger.ONE);
4285
}
4286
return mq.toBigDecimal(qsign, scale);
4287
} else {
4288
if (preferredScale != scale) {
4289
long compactVal = mq.toCompactValue(qsign);
4290
if(compactVal!=INFLATED) {
4291
return createAndStripZerosToMatchScale(compactVal, scale, preferredScale);
4292
}
4293
BigInteger intVal = mq.toBigInteger(qsign);
4294
return createAndStripZerosToMatchScale(intVal,scale, preferredScale);
4295
} else {
4296
return mq.toBigDecimal(qsign, scale);
4297
}
4298
}
4299
}
4300
4301
/**
4302
* Tests if quotient has to be incremented according the roundingMode
4303
*/
4304
private static boolean needIncrement(long ldivisor, int roundingMode,
4305
int qsign, MutableBigInteger mq, long r) {
4306
assert r != 0L;
4307
4308
int cmpFracHalf;
4309
if (r <= HALF_LONG_MIN_VALUE || r > HALF_LONG_MAX_VALUE) {
4310
cmpFracHalf = 1; // 2 * r can't fit into long
4311
} else {
4312
cmpFracHalf = longCompareMagnitude(2 * r, ldivisor);
4313
}
4314
4315
return commonNeedIncrement(roundingMode, qsign, cmpFracHalf, mq.isOdd());
4316
}
4317
4318
/**
4319
* Divides {@code BigInteger} value by {@code BigInteger} value and
4320
* do rounding based on the passed in roundingMode.
4321
*/
4322
private static BigInteger divideAndRound(BigInteger bdividend, BigInteger bdivisor, int roundingMode) {
4323
boolean isRemainderZero; // record remainder is zero or not
4324
int qsign; // quotient sign
4325
// Descend into mutables for faster remainder checks
4326
MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4327
MutableBigInteger mq = new MutableBigInteger();
4328
MutableBigInteger mdivisor = new MutableBigInteger(bdivisor.mag);
4329
MutableBigInteger mr = mdividend.divide(mdivisor, mq);
4330
isRemainderZero = mr.isZero();
4331
qsign = (bdividend.signum != bdivisor.signum) ? -1 : 1;
4332
if (!isRemainderZero) {
4333
if (needIncrement(mdivisor, roundingMode, qsign, mq, mr)) {
4334
mq.add(MutableBigInteger.ONE);
4335
}
4336
}
4337
return mq.toBigInteger(qsign);
4338
}
4339
4340
/**
4341
* Internally used for division operation for division {@code BigInteger}
4342
* by {@code BigInteger}.
4343
* The returned {@code BigDecimal} object is the quotient whose scale is set
4344
* to the passed in scale. If the remainder is not zero, it will be rounded
4345
* based on the passed in roundingMode. Also, if the remainder is zero and
4346
* the last parameter, i.e. preferredScale is NOT equal to scale, the
4347
* trailing zeros of the result is stripped to match the preferredScale.
4348
*/
4349
private static BigDecimal divideAndRound(BigInteger bdividend, BigInteger bdivisor, int scale, int roundingMode,
4350
int preferredScale) {
4351
boolean isRemainderZero; // record remainder is zero or not
4352
int qsign; // quotient sign
4353
// Descend into mutables for faster remainder checks
4354
MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4355
MutableBigInteger mq = new MutableBigInteger();
4356
MutableBigInteger mdivisor = new MutableBigInteger(bdivisor.mag);
4357
MutableBigInteger mr = mdividend.divide(mdivisor, mq);
4358
isRemainderZero = mr.isZero();
4359
qsign = (bdividend.signum != bdivisor.signum) ? -1 : 1;
4360
if (!isRemainderZero) {
4361
if (needIncrement(mdivisor, roundingMode, qsign, mq, mr)) {
4362
mq.add(MutableBigInteger.ONE);
4363
}
4364
return mq.toBigDecimal(qsign, scale);
4365
} else {
4366
if (preferredScale != scale) {
4367
long compactVal = mq.toCompactValue(qsign);
4368
if (compactVal != INFLATED) {
4369
return createAndStripZerosToMatchScale(compactVal, scale, preferredScale);
4370
}
4371
BigInteger intVal = mq.toBigInteger(qsign);
4372
return createAndStripZerosToMatchScale(intVal, scale, preferredScale);
4373
} else {
4374
return mq.toBigDecimal(qsign, scale);
4375
}
4376
}
4377
}
4378
4379
/**
4380
* Tests if quotient has to be incremented according the roundingMode
4381
*/
4382
private static boolean needIncrement(MutableBigInteger mdivisor, int roundingMode,
4383
int qsign, MutableBigInteger mq, MutableBigInteger mr) {
4384
assert !mr.isZero();
4385
int cmpFracHalf = mr.compareHalf(mdivisor);
4386
return commonNeedIncrement(roundingMode, qsign, cmpFracHalf, mq.isOdd());
4387
}
4388
4389
/**
4390
* Remove insignificant trailing zeros from this
4391
* {@code BigInteger} value until the preferred scale is reached or no
4392
* more zeros can be removed. If the preferred scale is less than
4393
* Integer.MIN_VALUE, all the trailing zeros will be removed.
4394
*
4395
* @return new {@code BigDecimal} with a scale possibly reduced
4396
* to be closed to the preferred scale.
4397
*/
4398
private static BigDecimal createAndStripZerosToMatchScale(BigInteger intVal, int scale, long preferredScale) {
4399
BigInteger qr[]; // quotient-remainder pair
4400
while (intVal.compareMagnitude(BigInteger.TEN) >= 0
4401
&& scale > preferredScale) {
4402
if (intVal.testBit(0))
4403
break; // odd number cannot end in 0
4404
qr = intVal.divideAndRemainder(BigInteger.TEN);
4405
if (qr[1].signum() != 0)
4406
break; // non-0 remainder
4407
intVal = qr[0];
4408
scale = checkScale(intVal,(long) scale - 1); // could Overflow
4409
}
4410
return valueOf(intVal, scale, 0);
4411
}
4412
4413
/**
4414
* Remove insignificant trailing zeros from this
4415
* {@code long} value until the preferred scale is reached or no
4416
* more zeros can be removed. If the preferred scale is less than
4417
* Integer.MIN_VALUE, all the trailing zeros will be removed.
4418
*
4419
* @return new {@code BigDecimal} with a scale possibly reduced
4420
* to be closed to the preferred scale.
4421
*/
4422
private static BigDecimal createAndStripZerosToMatchScale(long compactVal, int scale, long preferredScale) {
4423
while (Math.abs(compactVal) >= 10L && scale > preferredScale) {
4424
if ((compactVal & 1L) != 0L)
4425
break; // odd number cannot end in 0
4426
long r = compactVal % 10L;
4427
if (r != 0L)
4428
break; // non-0 remainder
4429
compactVal /= 10;
4430
scale = checkScale(compactVal, (long) scale - 1); // could Overflow
4431
}
4432
return valueOf(compactVal, scale);
4433
}
4434
4435
private static BigDecimal stripZerosToMatchScale(BigInteger intVal, long intCompact, int scale, int preferredScale) {
4436
if(intCompact!=INFLATED) {
4437
return createAndStripZerosToMatchScale(intCompact, scale, preferredScale);
4438
} else {
4439
return createAndStripZerosToMatchScale(intVal==null ? INFLATED_BIGINT : intVal,
4440
scale, preferredScale);
4441
}
4442
}
4443
4444
/*
4445
* returns INFLATED if oveflow
4446
*/
4447
private static long add(long xs, long ys){
4448
long sum = xs + ys;
4449
// See "Hacker's Delight" section 2-12 for explanation of
4450
// the overflow test.
4451
if ( (((sum ^ xs) & (sum ^ ys))) >= 0L) { // not overflowed
4452
return sum;
4453
}
4454
return INFLATED;
4455
}
4456
4457
private static BigDecimal add(long xs, long ys, int scale){
4458
long sum = add(xs, ys);
4459
if (sum!=INFLATED)
4460
return BigDecimal.valueOf(sum, scale);
4461
return new BigDecimal(BigInteger.valueOf(xs).add(ys), scale);
4462
}
4463
4464
private static BigDecimal add(final long xs, int scale1, final long ys, int scale2) {
4465
long sdiff = (long) scale1 - scale2;
4466
if (sdiff == 0) {
4467
return add(xs, ys, scale1);
4468
} else if (sdiff < 0) {
4469
int raise = checkScale(xs,-sdiff);
4470
long scaledX = longMultiplyPowerTen(xs, raise);
4471
if (scaledX != INFLATED) {
4472
return add(scaledX, ys, scale2);
4473
} else {
4474
BigInteger bigsum = bigMultiplyPowerTen(xs,raise).add(ys);
4475
return ((xs^ys)>=0) ? // same sign test
4476
new BigDecimal(bigsum, INFLATED, scale2, 0)
4477
: valueOf(bigsum, scale2, 0);
4478
}
4479
} else {
4480
int raise = checkScale(ys,sdiff);
4481
long scaledY = longMultiplyPowerTen(ys, raise);
4482
if (scaledY != INFLATED) {
4483
return add(xs, scaledY, scale1);
4484
} else {
4485
BigInteger bigsum = bigMultiplyPowerTen(ys,raise).add(xs);
4486
return ((xs^ys)>=0) ?
4487
new BigDecimal(bigsum, INFLATED, scale1, 0)
4488
: valueOf(bigsum, scale1, 0);
4489
}
4490
}
4491
}
4492
4493
private static BigDecimal add(final long xs, int scale1, BigInteger snd, int scale2) {
4494
int rscale = scale1;
4495
long sdiff = (long)rscale - scale2;
4496
boolean sameSigns = (Long.signum(xs) == snd.signum);
4497
BigInteger sum;
4498
if (sdiff < 0) {
4499
int raise = checkScale(xs,-sdiff);
4500
rscale = scale2;
4501
long scaledX = longMultiplyPowerTen(xs, raise);
4502
if (scaledX == INFLATED) {
4503
sum = snd.add(bigMultiplyPowerTen(xs,raise));
4504
} else {
4505
sum = snd.add(scaledX);
4506
}
4507
} else { //if (sdiff > 0) {
4508
int raise = checkScale(snd,sdiff);
4509
snd = bigMultiplyPowerTen(snd,raise);
4510
sum = snd.add(xs);
4511
}
4512
return (sameSigns) ?
4513
new BigDecimal(sum, INFLATED, rscale, 0) :
4514
valueOf(sum, rscale, 0);
4515
}
4516
4517
private static BigDecimal add(BigInteger fst, int scale1, BigInteger snd, int scale2) {
4518
int rscale = scale1;
4519
long sdiff = (long)rscale - scale2;
4520
if (sdiff != 0) {
4521
if (sdiff < 0) {
4522
int raise = checkScale(fst,-sdiff);
4523
rscale = scale2;
4524
fst = bigMultiplyPowerTen(fst,raise);
4525
} else {
4526
int raise = checkScale(snd,sdiff);
4527
snd = bigMultiplyPowerTen(snd,raise);
4528
}
4529
}
4530
BigInteger sum = fst.add(snd);
4531
return (fst.signum == snd.signum) ?
4532
new BigDecimal(sum, INFLATED, rscale, 0) :
4533
valueOf(sum, rscale, 0);
4534
}
4535
4536
private static BigInteger bigMultiplyPowerTen(long value, int n) {
4537
if (n <= 0)
4538
return BigInteger.valueOf(value);
4539
return bigTenToThe(n).multiply(value);
4540
}
4541
4542
private static BigInteger bigMultiplyPowerTen(BigInteger value, int n) {
4543
if (n <= 0)
4544
return value;
4545
if(n<LONG_TEN_POWERS_TABLE.length) {
4546
return value.multiply(LONG_TEN_POWERS_TABLE[n]);
4547
}
4548
return value.multiply(bigTenToThe(n));
4549
}
4550
4551
/**
4552
* Returns a {@code BigDecimal} whose value is {@code (xs /
4553
* ys)}, with rounding according to the context settings.
4554
*
4555
* Fast path - used only when (xscale <= yscale && yscale < 18
4556
* && mc.presision<18) {
4557
*/
4558
private static BigDecimal divideSmallFastPath(final long xs, int xscale,
4559
final long ys, int yscale,
4560
long preferredScale, MathContext mc) {
4561
int mcp = mc.precision;
4562
int roundingMode = mc.roundingMode.oldMode;
4563
4564
assert (xscale <= yscale) && (yscale < 18) && (mcp < 18);
4565
int xraise = yscale - xscale; // xraise >=0
4566
long scaledX = (xraise==0) ? xs :
4567
longMultiplyPowerTen(xs, xraise); // can't overflow here!
4568
BigDecimal quotient;
4569
4570
int cmp = longCompareMagnitude(scaledX, ys);
4571
if(cmp > 0) { // satisfy constraint (b)
4572
yscale -= 1; // [that is, divisor *= 10]
4573
int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4574
if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
4575
// assert newScale >= xscale
4576
int raise = checkScaleNonZero((long) mcp + yscale - xscale);
4577
long scaledXs;
4578
if ((scaledXs = longMultiplyPowerTen(xs, raise)) == INFLATED) {
4579
quotient = null;
4580
if((mcp-1) >=0 && (mcp-1)<LONG_TEN_POWERS_TABLE.length) {
4581
quotient = multiplyDivideAndRound(LONG_TEN_POWERS_TABLE[mcp-1], scaledX, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4582
}
4583
if(quotient==null) {
4584
BigInteger rb = bigMultiplyPowerTen(scaledX,mcp-1);
4585
quotient = divideAndRound(rb, ys,
4586
scl, roundingMode, checkScaleNonZero(preferredScale));
4587
}
4588
} else {
4589
quotient = divideAndRound(scaledXs, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4590
}
4591
} else {
4592
int newScale = checkScaleNonZero((long) xscale - mcp);
4593
// assert newScale >= yscale
4594
if (newScale == yscale) { // easy case
4595
quotient = divideAndRound(xs, ys, scl, roundingMode,checkScaleNonZero(preferredScale));
4596
} else {
4597
int raise = checkScaleNonZero((long) newScale - yscale);
4598
long scaledYs;
4599
if ((scaledYs = longMultiplyPowerTen(ys, raise)) == INFLATED) {
4600
BigInteger rb = bigMultiplyPowerTen(ys,raise);
4601
quotient = divideAndRound(BigInteger.valueOf(xs),
4602
rb, scl, roundingMode,checkScaleNonZero(preferredScale));
4603
} else {
4604
quotient = divideAndRound(xs, scaledYs, scl, roundingMode,checkScaleNonZero(preferredScale));
4605
}
4606
}
4607
}
4608
} else {
4609
// abs(scaledX) <= abs(ys)
4610
// result is "scaledX * 10^msp / ys"
4611
int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4612
if(cmp==0) {
4613
// abs(scaleX)== abs(ys) => result will be scaled 10^mcp + correct sign
4614
quotient = roundedTenPower(((scaledX < 0) == (ys < 0)) ? 1 : -1, mcp, scl, checkScaleNonZero(preferredScale));
4615
} else {
4616
// abs(scaledX) < abs(ys)
4617
long scaledXs;
4618
if ((scaledXs = longMultiplyPowerTen(scaledX, mcp)) == INFLATED) {
4619
quotient = null;
4620
if(mcp<LONG_TEN_POWERS_TABLE.length) {
4621
quotient = multiplyDivideAndRound(LONG_TEN_POWERS_TABLE[mcp], scaledX, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4622
}
4623
if(quotient==null) {
4624
BigInteger rb = bigMultiplyPowerTen(scaledX,mcp);
4625
quotient = divideAndRound(rb, ys,
4626
scl, roundingMode, checkScaleNonZero(preferredScale));
4627
}
4628
} else {
4629
quotient = divideAndRound(scaledXs, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4630
}
4631
}
4632
}
4633
// doRound, here, only affects 1000000000 case.
4634
return doRound(quotient,mc);
4635
}
4636
4637
/**
4638
* Returns a {@code BigDecimal} whose value is {@code (xs /
4639
* ys)}, with rounding according to the context settings.
4640
*/
4641
private static BigDecimal divide(final long xs, int xscale, final long ys, int yscale, long preferredScale, MathContext mc) {
4642
int mcp = mc.precision;
4643
if(xscale <= yscale && yscale < 18 && mcp<18) {
4644
return divideSmallFastPath(xs, xscale, ys, yscale, preferredScale, mc);
4645
}
4646
if (compareMagnitudeNormalized(xs, xscale, ys, yscale) > 0) {// satisfy constraint (b)
4647
yscale -= 1; // [that is, divisor *= 10]
4648
}
4649
int roundingMode = mc.roundingMode.oldMode;
4650
// In order to find out whether the divide generates the exact result,
4651
// we avoid calling the above divide method. 'quotient' holds the
4652
// return BigDecimal object whose scale will be set to 'scl'.
4653
int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4654
BigDecimal quotient;
4655
if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
4656
int raise = checkScaleNonZero((long) mcp + yscale - xscale);
4657
long scaledXs;
4658
if ((scaledXs = longMultiplyPowerTen(xs, raise)) == INFLATED) {
4659
BigInteger rb = bigMultiplyPowerTen(xs,raise);
4660
quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4661
} else {
4662
quotient = divideAndRound(scaledXs, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4663
}
4664
} else {
4665
int newScale = checkScaleNonZero((long) xscale - mcp);
4666
// assert newScale >= yscale
4667
if (newScale == yscale) { // easy case
4668
quotient = divideAndRound(xs, ys, scl, roundingMode,checkScaleNonZero(preferredScale));
4669
} else {
4670
int raise = checkScaleNonZero((long) newScale - yscale);
4671
long scaledYs;
4672
if ((scaledYs = longMultiplyPowerTen(ys, raise)) == INFLATED) {
4673
BigInteger rb = bigMultiplyPowerTen(ys,raise);
4674
quotient = divideAndRound(BigInteger.valueOf(xs),
4675
rb, scl, roundingMode,checkScaleNonZero(preferredScale));
4676
} else {
4677
quotient = divideAndRound(xs, scaledYs, scl, roundingMode,checkScaleNonZero(preferredScale));
4678
}
4679
}
4680
}
4681
// doRound, here, only affects 1000000000 case.
4682
return doRound(quotient,mc);
4683
}
4684
4685
/**
4686
* Returns a {@code BigDecimal} whose value is {@code (xs /
4687
* ys)}, with rounding according to the context settings.
4688
*/
4689
private static BigDecimal divide(BigInteger xs, int xscale, long ys, int yscale, long preferredScale, MathContext mc) {
4690
// Normalize dividend & divisor so that both fall into [0.1, 0.999...]
4691
if ((-compareMagnitudeNormalized(ys, yscale, xs, xscale)) > 0) {// satisfy constraint (b)
4692
yscale -= 1; // [that is, divisor *= 10]
4693
}
4694
int mcp = mc.precision;
4695
int roundingMode = mc.roundingMode.oldMode;
4696
4697
// In order to find out whether the divide generates the exact result,
4698
// we avoid calling the above divide method. 'quotient' holds the
4699
// return BigDecimal object whose scale will be set to 'scl'.
4700
BigDecimal quotient;
4701
int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4702
if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
4703
int raise = checkScaleNonZero((long) mcp + yscale - xscale);
4704
BigInteger rb = bigMultiplyPowerTen(xs,raise);
4705
quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4706
} else {
4707
int newScale = checkScaleNonZero((long) xscale - mcp);
4708
// assert newScale >= yscale
4709
if (newScale == yscale) { // easy case
4710
quotient = divideAndRound(xs, ys, scl, roundingMode,checkScaleNonZero(preferredScale));
4711
} else {
4712
int raise = checkScaleNonZero((long) newScale - yscale);
4713
long scaledYs;
4714
if ((scaledYs = longMultiplyPowerTen(ys, raise)) == INFLATED) {
4715
BigInteger rb = bigMultiplyPowerTen(ys,raise);
4716
quotient = divideAndRound(xs, rb, scl, roundingMode,checkScaleNonZero(preferredScale));
4717
} else {
4718
quotient = divideAndRound(xs, scaledYs, scl, roundingMode,checkScaleNonZero(preferredScale));
4719
}
4720
}
4721
}
4722
// doRound, here, only affects 1000000000 case.
4723
return doRound(quotient, mc);
4724
}
4725
4726
/**
4727
* Returns a {@code BigDecimal} whose value is {@code (xs /
4728
* ys)}, with rounding according to the context settings.
4729
*/
4730
private static BigDecimal divide(long xs, int xscale, BigInteger ys, int yscale, long preferredScale, MathContext mc) {
4731
// Normalize dividend & divisor so that both fall into [0.1, 0.999...]
4732
if (compareMagnitudeNormalized(xs, xscale, ys, yscale) > 0) {// satisfy constraint (b)
4733
yscale -= 1; // [that is, divisor *= 10]
4734
}
4735
int mcp = mc.precision;
4736
int roundingMode = mc.roundingMode.oldMode;
4737
4738
// In order to find out whether the divide generates the exact result,
4739
// we avoid calling the above divide method. 'quotient' holds the
4740
// return BigDecimal object whose scale will be set to 'scl'.
4741
BigDecimal quotient;
4742
int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4743
if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
4744
int raise = checkScaleNonZero((long) mcp + yscale - xscale);
4745
BigInteger rb = bigMultiplyPowerTen(xs,raise);
4746
quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4747
} else {
4748
int newScale = checkScaleNonZero((long) xscale - mcp);
4749
int raise = checkScaleNonZero((long) newScale - yscale);
4750
BigInteger rb = bigMultiplyPowerTen(ys,raise);
4751
quotient = divideAndRound(BigInteger.valueOf(xs), rb, scl, roundingMode,checkScaleNonZero(preferredScale));
4752
}
4753
// doRound, here, only affects 1000000000 case.
4754
return doRound(quotient, mc);
4755
}
4756
4757
/**
4758
* Returns a {@code BigDecimal} whose value is {@code (xs /
4759
* ys)}, with rounding according to the context settings.
4760
*/
4761
private static BigDecimal divide(BigInteger xs, int xscale, BigInteger ys, int yscale, long preferredScale, MathContext mc) {
4762
// Normalize dividend & divisor so that both fall into [0.1, 0.999...]
4763
if (compareMagnitudeNormalized(xs, xscale, ys, yscale) > 0) {// satisfy constraint (b)
4764
yscale -= 1; // [that is, divisor *= 10]
4765
}
4766
int mcp = mc.precision;
4767
int roundingMode = mc.roundingMode.oldMode;
4768
4769
// In order to find out whether the divide generates the exact result,
4770
// we avoid calling the above divide method. 'quotient' holds the
4771
// return BigDecimal object whose scale will be set to 'scl'.
4772
BigDecimal quotient;
4773
int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4774
if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
4775
int raise = checkScaleNonZero((long) mcp + yscale - xscale);
4776
BigInteger rb = bigMultiplyPowerTen(xs,raise);
4777
quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4778
} else {
4779
int newScale = checkScaleNonZero((long) xscale - mcp);
4780
int raise = checkScaleNonZero((long) newScale - yscale);
4781
BigInteger rb = bigMultiplyPowerTen(ys,raise);
4782
quotient = divideAndRound(xs, rb, scl, roundingMode,checkScaleNonZero(preferredScale));
4783
}
4784
// doRound, here, only affects 1000000000 case.
4785
return doRound(quotient, mc);
4786
}
4787
4788
/*
4789
* performs divideAndRound for (dividend0*dividend1, divisor)
4790
* returns null if quotient can't fit into long value;
4791
*/
4792
private static BigDecimal multiplyDivideAndRound(long dividend0, long dividend1, long divisor, int scale, int roundingMode,
4793
int preferredScale) {
4794
int qsign = Long.signum(dividend0)*Long.signum(dividend1)*Long.signum(divisor);
4795
dividend0 = Math.abs(dividend0);
4796
dividend1 = Math.abs(dividend1);
4797
divisor = Math.abs(divisor);
4798
// multiply dividend0 * dividend1
4799
long d0_hi = dividend0 >>> 32;
4800
long d0_lo = dividend0 & LONG_MASK;
4801
long d1_hi = dividend1 >>> 32;
4802
long d1_lo = dividend1 & LONG_MASK;
4803
long product = d0_lo * d1_lo;
4804
long d0 = product & LONG_MASK;
4805
long d1 = product >>> 32;
4806
product = d0_hi * d1_lo + d1;
4807
d1 = product & LONG_MASK;
4808
long d2 = product >>> 32;
4809
product = d0_lo * d1_hi + d1;
4810
d1 = product & LONG_MASK;
4811
d2 += product >>> 32;
4812
long d3 = d2>>>32;
4813
d2 &= LONG_MASK;
4814
product = d0_hi*d1_hi + d2;
4815
d2 = product & LONG_MASK;
4816
d3 = ((product>>>32) + d3) & LONG_MASK;
4817
final long dividendHi = make64(d3,d2);
4818
final long dividendLo = make64(d1,d0);
4819
// divide
4820
return divideAndRound128(dividendHi, dividendLo, divisor, qsign, scale, roundingMode, preferredScale);
4821
}
4822
4823
private static final long DIV_NUM_BASE = (1L<<32); // Number base (32 bits).
4824
4825
/*
4826
* divideAndRound 128-bit value by long divisor.
4827
* returns null if quotient can't fit into long value;
4828
* Specialized version of Knuth's division
4829
*/
4830
private static BigDecimal divideAndRound128(final long dividendHi, final long dividendLo, long divisor, int sign,
4831
int scale, int roundingMode, int preferredScale) {
4832
if (dividendHi >= divisor) {
4833
return null;
4834
}
4835
4836
final int shift = Long.numberOfLeadingZeros(divisor);
4837
divisor <<= shift;
4838
4839
final long v1 = divisor >>> 32;
4840
final long v0 = divisor & LONG_MASK;
4841
4842
long tmp = dividendLo << shift;
4843
long u1 = tmp >>> 32;
4844
long u0 = tmp & LONG_MASK;
4845
4846
tmp = (dividendHi << shift) | (dividendLo >>> 64 - shift);
4847
long u2 = tmp & LONG_MASK;
4848
long q1, r_tmp;
4849
if (v1 == 1) {
4850
q1 = tmp;
4851
r_tmp = 0;
4852
} else if (tmp >= 0) {
4853
q1 = tmp / v1;
4854
r_tmp = tmp - q1 * v1;
4855
} else {
4856
long[] rq = divRemNegativeLong(tmp, v1);
4857
q1 = rq[1];
4858
r_tmp = rq[0];
4859
}
4860
4861
while(q1 >= DIV_NUM_BASE || unsignedLongCompare(q1*v0, make64(r_tmp, u1))) {
4862
q1--;
4863
r_tmp += v1;
4864
if (r_tmp >= DIV_NUM_BASE)
4865
break;
4866
}
4867
4868
tmp = mulsub(u2,u1,v1,v0,q1);
4869
u1 = tmp & LONG_MASK;
4870
long q0;
4871
if (v1 == 1) {
4872
q0 = tmp;
4873
r_tmp = 0;
4874
} else if (tmp >= 0) {
4875
q0 = tmp / v1;
4876
r_tmp = tmp - q0 * v1;
4877
} else {
4878
long[] rq = divRemNegativeLong(tmp, v1);
4879
q0 = rq[1];
4880
r_tmp = rq[0];
4881
}
4882
4883
while(q0 >= DIV_NUM_BASE || unsignedLongCompare(q0*v0,make64(r_tmp,u0))) {
4884
q0--;
4885
r_tmp += v1;
4886
if (r_tmp >= DIV_NUM_BASE)
4887
break;
4888
}
4889
4890
if((int)q1 < 0) {
4891
// result (which is positive and unsigned here)
4892
// can't fit into long due to sign bit is used for value
4893
MutableBigInteger mq = new MutableBigInteger(new int[]{(int)q1, (int)q0});
4894
if (roundingMode == ROUND_DOWN && scale == preferredScale) {
4895
return mq.toBigDecimal(sign, scale);
4896
}
4897
long r = mulsub(u1, u0, v1, v0, q0) >>> shift;
4898
if (r != 0) {
4899
if(needIncrement(divisor >>> shift, roundingMode, sign, mq, r)){
4900
mq.add(MutableBigInteger.ONE);
4901
}
4902
return mq.toBigDecimal(sign, scale);
4903
} else {
4904
if (preferredScale != scale) {
4905
BigInteger intVal = mq.toBigInteger(sign);
4906
return createAndStripZerosToMatchScale(intVal,scale, preferredScale);
4907
} else {
4908
return mq.toBigDecimal(sign, scale);
4909
}
4910
}
4911
}
4912
4913
long q = make64(q1,q0);
4914
q*=sign;
4915
4916
if (roundingMode == ROUND_DOWN && scale == preferredScale)
4917
return valueOf(q, scale);
4918
4919
long r = mulsub(u1, u0, v1, v0, q0) >>> shift;
4920
if (r != 0) {
4921
boolean increment = needIncrement(divisor >>> shift, roundingMode, sign, q, r);
4922
return valueOf((increment ? q + sign : q), scale);
4923
} else {
4924
if (preferredScale != scale) {
4925
return createAndStripZerosToMatchScale(q, scale, preferredScale);
4926
} else {
4927
return valueOf(q, scale);
4928
}
4929
}
4930
}
4931
4932
/*
4933
* calculate divideAndRound for ldividend*10^raise / divisor
4934
* when abs(dividend)==abs(divisor);
4935
*/
4936
private static BigDecimal roundedTenPower(int qsign, int raise, int scale, int preferredScale) {
4937
if (scale > preferredScale) {
4938
int diff = scale - preferredScale;
4939
if(diff < raise) {
4940
return scaledTenPow(raise - diff, qsign, preferredScale);
4941
} else {
4942
return valueOf(qsign,scale-raise);
4943
}
4944
} else {
4945
return scaledTenPow(raise, qsign, scale);
4946
}
4947
}
4948
4949
static BigDecimal scaledTenPow(int n, int sign, int scale) {
4950
if (n < LONG_TEN_POWERS_TABLE.length)
4951
return valueOf(sign*LONG_TEN_POWERS_TABLE[n],scale);
4952
else {
4953
BigInteger unscaledVal = bigTenToThe(n);
4954
if(sign==-1) {
4955
unscaledVal = unscaledVal.negate();
4956
}
4957
return new BigDecimal(unscaledVal, INFLATED, scale, n+1);
4958
}
4959
}
4960
4961
/**
4962
* Calculate the quotient and remainder of dividing a negative long by
4963
* another long.
4964
*
4965
* @param n the numerator; must be negative
4966
* @param d the denominator; must not be unity
4967
* @return a two-element {@long} array with the remainder and quotient in
4968
* the initial and final elements, respectively
4969
*/
4970
private static long[] divRemNegativeLong(long n, long d) {
4971
assert n < 0 : "Non-negative numerator " + n;
4972
assert d != 1 : "Unity denominator";
4973
4974
// Approximate the quotient and remainder
4975
long q = (n >>> 1) / (d >>> 1);
4976
long r = n - q * d;
4977
4978
// Correct the approximation
4979
while (r < 0) {
4980
r += d;
4981
q--;
4982
}
4983
while (r >= d) {
4984
r -= d;
4985
q++;
4986
}
4987
4988
// n - q*d == r && 0 <= r < d, hence we're done.
4989
return new long[] {r, q};
4990
}
4991
4992
private static long make64(long hi, long lo) {
4993
return hi<<32 | lo;
4994
}
4995
4996
private static long mulsub(long u1, long u0, final long v1, final long v0, long q0) {
4997
long tmp = u0 - q0*v0;
4998
return make64(u1 + (tmp>>>32) - q0*v1,tmp & LONG_MASK);
4999
}
5000
5001
private static boolean unsignedLongCompare(long one, long two) {
5002
return (one+Long.MIN_VALUE) > (two+Long.MIN_VALUE);
5003
}
5004
5005
private static boolean unsignedLongCompareEq(long one, long two) {
5006
return (one+Long.MIN_VALUE) >= (two+Long.MIN_VALUE);
5007
}
5008
5009
5010
// Compare Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5011
private static int compareMagnitudeNormalized(long xs, int xscale, long ys, int yscale) {
5012
// assert xs!=0 && ys!=0
5013
int sdiff = xscale - yscale;
5014
if (sdiff != 0) {
5015
if (sdiff < 0) {
5016
xs = longMultiplyPowerTen(xs, -sdiff);
5017
} else { // sdiff > 0
5018
ys = longMultiplyPowerTen(ys, sdiff);
5019
}
5020
}
5021
if (xs != INFLATED)
5022
return (ys != INFLATED) ? longCompareMagnitude(xs, ys) : -1;
5023
else
5024
return 1;
5025
}
5026
5027
// Compare Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5028
private static int compareMagnitudeNormalized(long xs, int xscale, BigInteger ys, int yscale) {
5029
// assert "ys can't be represented as long"
5030
if (xs == 0)
5031
return -1;
5032
int sdiff = xscale - yscale;
5033
if (sdiff < 0) {
5034
if (longMultiplyPowerTen(xs, -sdiff) == INFLATED ) {
5035
return bigMultiplyPowerTen(xs, -sdiff).compareMagnitude(ys);
5036
}
5037
}
5038
return -1;
5039
}
5040
5041
// Compare Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5042
private static int compareMagnitudeNormalized(BigInteger xs, int xscale, BigInteger ys, int yscale) {
5043
int sdiff = xscale - yscale;
5044
if (sdiff < 0) {
5045
return bigMultiplyPowerTen(xs, -sdiff).compareMagnitude(ys);
5046
} else { // sdiff >= 0
5047
return xs.compareMagnitude(bigMultiplyPowerTen(ys, sdiff));
5048
}
5049
}
5050
5051
private static long multiply(long x, long y){
5052
long product = x * y;
5053
long ax = Math.abs(x);
5054
long ay = Math.abs(y);
5055
if (((ax | ay) >>> 31 == 0) || (y == 0) || (product / y == x)){
5056
return product;
5057
}
5058
return INFLATED;
5059
}
5060
5061
private static BigDecimal multiply(long x, long y, int scale) {
5062
long product = multiply(x, y);
5063
if(product!=INFLATED) {
5064
return valueOf(product,scale);
5065
}
5066
return new BigDecimal(BigInteger.valueOf(x).multiply(y),INFLATED,scale,0);
5067
}
5068
5069
private static BigDecimal multiply(long x, BigInteger y, int scale) {
5070
if(x==0) {
5071
return zeroValueOf(scale);
5072
}
5073
return new BigDecimal(y.multiply(x),INFLATED,scale,0);
5074
}
5075
5076
private static BigDecimal multiply(BigInteger x, BigInteger y, int scale) {
5077
return new BigDecimal(x.multiply(y),INFLATED,scale,0);
5078
}
5079
5080
/**
5081
* Multiplies two long values and rounds according {@code MathContext}
5082
*/
5083
private static BigDecimal multiplyAndRound(long x, long y, int scale, MathContext mc) {
5084
long product = multiply(x, y);
5085
if(product!=INFLATED) {
5086
return doRound(product, scale, mc);
5087
}
5088
// attempt to do it in 128 bits
5089
int rsign = 1;
5090
if(x < 0) {
5091
x = -x;
5092
rsign = -1;
5093
}
5094
if(y < 0) {
5095
y = -y;
5096
rsign *= -1;
5097
}
5098
// multiply dividend0 * dividend1
5099
long m0_hi = x >>> 32;
5100
long m0_lo = x & LONG_MASK;
5101
long m1_hi = y >>> 32;
5102
long m1_lo = y & LONG_MASK;
5103
product = m0_lo * m1_lo;
5104
long m0 = product & LONG_MASK;
5105
long m1 = product >>> 32;
5106
product = m0_hi * m1_lo + m1;
5107
m1 = product & LONG_MASK;
5108
long m2 = product >>> 32;
5109
product = m0_lo * m1_hi + m1;
5110
m1 = product & LONG_MASK;
5111
m2 += product >>> 32;
5112
long m3 = m2>>>32;
5113
m2 &= LONG_MASK;
5114
product = m0_hi*m1_hi + m2;
5115
m2 = product & LONG_MASK;
5116
m3 = ((product>>>32) + m3) & LONG_MASK;
5117
final long mHi = make64(m3,m2);
5118
final long mLo = make64(m1,m0);
5119
BigDecimal res = doRound128(mHi, mLo, rsign, scale, mc);
5120
if(res!=null) {
5121
return res;
5122
}
5123
res = new BigDecimal(BigInteger.valueOf(x).multiply(y*rsign), INFLATED, scale, 0);
5124
return doRound(res,mc);
5125
}
5126
5127
private static BigDecimal multiplyAndRound(long x, BigInteger y, int scale, MathContext mc) {
5128
if(x==0) {
5129
return zeroValueOf(scale);
5130
}
5131
return doRound(y.multiply(x), scale, mc);
5132
}
5133
5134
private static BigDecimal multiplyAndRound(BigInteger x, BigInteger y, int scale, MathContext mc) {
5135
return doRound(x.multiply(y), scale, mc);
5136
}
5137
5138
/**
5139
* rounds 128-bit value according {@code MathContext}
5140
* returns null if result can't be repsented as compact BigDecimal.
5141
*/
5142
private static BigDecimal doRound128(long hi, long lo, int sign, int scale, MathContext mc) {
5143
int mcp = mc.precision;
5144
int drop;
5145
BigDecimal res = null;
5146
if(((drop = precision(hi, lo) - mcp) > 0)&&(drop<LONG_TEN_POWERS_TABLE.length)) {
5147
scale = checkScaleNonZero((long)scale - drop);
5148
res = divideAndRound128(hi, lo, LONG_TEN_POWERS_TABLE[drop], sign, scale, mc.roundingMode.oldMode, scale);
5149
}
5150
if(res!=null) {
5151
return doRound(res,mc);
5152
}
5153
return null;
5154
}
5155
5156
private static final long[][] LONGLONG_TEN_POWERS_TABLE = {
5157
{ 0L, 0x8AC7230489E80000L }, //10^19
5158
{ 0x5L, 0x6bc75e2d63100000L }, //10^20
5159
{ 0x36L, 0x35c9adc5dea00000L }, //10^21
5160
{ 0x21eL, 0x19e0c9bab2400000L }, //10^22
5161
{ 0x152dL, 0x02c7e14af6800000L }, //10^23
5162
{ 0xd3c2L, 0x1bcecceda1000000L }, //10^24
5163
{ 0x84595L, 0x161401484a000000L }, //10^25
5164
{ 0x52b7d2L, 0xdcc80cd2e4000000L }, //10^26
5165
{ 0x33b2e3cL, 0x9fd0803ce8000000L }, //10^27
5166
{ 0x204fce5eL, 0x3e25026110000000L }, //10^28
5167
{ 0x1431e0faeL, 0x6d7217caa0000000L }, //10^29
5168
{ 0xc9f2c9cd0L, 0x4674edea40000000L }, //10^30
5169
{ 0x7e37be2022L, 0xc0914b2680000000L }, //10^31
5170
{ 0x4ee2d6d415bL, 0x85acef8100000000L }, //10^32
5171
{ 0x314dc6448d93L, 0x38c15b0a00000000L }, //10^33
5172
{ 0x1ed09bead87c0L, 0x378d8e6400000000L }, //10^34
5173
{ 0x13426172c74d82L, 0x2b878fe800000000L }, //10^35
5174
{ 0xc097ce7bc90715L, 0xb34b9f1000000000L }, //10^36
5175
{ 0x785ee10d5da46d9L, 0x00f436a000000000L }, //10^37
5176
{ 0x4b3b4ca85a86c47aL, 0x098a224000000000L }, //10^38
5177
};
5178
5179
/*
5180
* returns precision of 128-bit value
5181
*/
5182
private static int precision(long hi, long lo){
5183
if(hi==0) {
5184
if(lo>=0) {
5185
return longDigitLength(lo);
5186
}
5187
return (unsignedLongCompareEq(lo, LONGLONG_TEN_POWERS_TABLE[0][1])) ? 20 : 19;
5188
// 0x8AC7230489E80000L = unsigned 2^19
5189
}
5190
int r = ((128 - Long.numberOfLeadingZeros(hi) + 1) * 1233) >>> 12;
5191
int idx = r-19;
5192
return (idx >= LONGLONG_TEN_POWERS_TABLE.length || longLongCompareMagnitude(hi, lo,
5193
LONGLONG_TEN_POWERS_TABLE[idx][0], LONGLONG_TEN_POWERS_TABLE[idx][1])) ? r : r + 1;
5194
}
5195
5196
/*
5197
* returns true if 128 bit number <hi0,lo0> is less then <hi1,lo1>
5198
* hi0 & hi1 should be non-negative
5199
*/
5200
private static boolean longLongCompareMagnitude(long hi0, long lo0, long hi1, long lo1) {
5201
if(hi0!=hi1) {
5202
return hi0<hi1;
5203
}
5204
return (lo0+Long.MIN_VALUE) <(lo1+Long.MIN_VALUE);
5205
}
5206
5207
private static BigDecimal divide(long dividend, int dividendScale, long divisor, int divisorScale, int scale, int roundingMode) {
5208
if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5209
int newScale = scale + divisorScale;
5210
int raise = newScale - dividendScale;
5211
if(raise<LONG_TEN_POWERS_TABLE.length) {
5212
long xs = dividend;
5213
if ((xs = longMultiplyPowerTen(xs, raise)) != INFLATED) {
5214
return divideAndRound(xs, divisor, scale, roundingMode, scale);
5215
}
5216
BigDecimal q = multiplyDivideAndRound(LONG_TEN_POWERS_TABLE[raise], dividend, divisor, scale, roundingMode, scale);
5217
if(q!=null) {
5218
return q;
5219
}
5220
}
5221
BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5222
return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5223
} else {
5224
int newScale = checkScale(divisor,(long)dividendScale - scale);
5225
int raise = newScale - divisorScale;
5226
if(raise<LONG_TEN_POWERS_TABLE.length) {
5227
long ys = divisor;
5228
if ((ys = longMultiplyPowerTen(ys, raise)) != INFLATED) {
5229
return divideAndRound(dividend, ys, scale, roundingMode, scale);
5230
}
5231
}
5232
BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5233
return divideAndRound(BigInteger.valueOf(dividend), scaledDivisor, scale, roundingMode, scale);
5234
}
5235
}
5236
5237
private static BigDecimal divide(BigInteger dividend, int dividendScale, long divisor, int divisorScale, int scale, int roundingMode) {
5238
if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5239
int newScale = scale + divisorScale;
5240
int raise = newScale - dividendScale;
5241
BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5242
return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5243
} else {
5244
int newScale = checkScale(divisor,(long)dividendScale - scale);
5245
int raise = newScale - divisorScale;
5246
if(raise<LONG_TEN_POWERS_TABLE.length) {
5247
long ys = divisor;
5248
if ((ys = longMultiplyPowerTen(ys, raise)) != INFLATED) {
5249
return divideAndRound(dividend, ys, scale, roundingMode, scale);
5250
}
5251
}
5252
BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5253
return divideAndRound(dividend, scaledDivisor, scale, roundingMode, scale);
5254
}
5255
}
5256
5257
private static BigDecimal divide(long dividend, int dividendScale, BigInteger divisor, int divisorScale, int scale, int roundingMode) {
5258
if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5259
int newScale = scale + divisorScale;
5260
int raise = newScale - dividendScale;
5261
BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5262
return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5263
} else {
5264
int newScale = checkScale(divisor,(long)dividendScale - scale);
5265
int raise = newScale - divisorScale;
5266
BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5267
return divideAndRound(BigInteger.valueOf(dividend), scaledDivisor, scale, roundingMode, scale);
5268
}
5269
}
5270
5271
private static BigDecimal divide(BigInteger dividend, int dividendScale, BigInteger divisor, int divisorScale, int scale, int roundingMode) {
5272
if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5273
int newScale = scale + divisorScale;
5274
int raise = newScale - dividendScale;
5275
BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5276
return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5277
} else {
5278
int newScale = checkScale(divisor,(long)dividendScale - scale);
5279
int raise = newScale - divisorScale;
5280
BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5281
return divideAndRound(dividend, scaledDivisor, scale, roundingMode, scale);
5282
}
5283
}
5284
5285
}
5286
5287