diff options
author | Warren Levy <warrenl@redhat.com> | 2001-01-10 09:38:08 +0000 |
---|---|---|
committer | Warren Levy <warrenl@gcc.gnu.org> | 2001-01-10 09:38:08 +0000 |
commit | 698489049d429a0d27fa0552185c104d545a1807 (patch) | |
tree | 232892def7d8356240f760851dd1f02e6943744d /libjava/java/math | |
parent | 534808a32ac90641ef010c92af2f588210176595 (diff) | |
download | gcc-698489049d429a0d27fa0552185c104d545a1807.zip gcc-698489049d429a0d27fa0552185c104d545a1807.tar.gz gcc-698489049d429a0d27fa0552185c104d545a1807.tar.bz2 |
re PR libgcj/1596 (setScale() missing from java.math.BigDecimal)
Fix for PR libgcj/1596:
* java/math/BigDecimal.java (divide): Check newScale for validity.
Ensure that BigInteger.pow() is called with a non-negative value.
(setScale (int)): New public method.
(setScale (int,int)): New public method.
From-SVN: r38861
Diffstat (limited to 'libjava/java/math')
-rw-r--r-- | libjava/java/math/BigDecimal.java | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/libjava/java/math/BigDecimal.java b/libjava/java/math/BigDecimal.java index 6844b24..007f3a3 100644 --- a/libjava/java/math/BigDecimal.java +++ b/libjava/java/math/BigDecimal.java @@ -1,5 +1,5 @@ /* java.math.BigDecimal -- Arbitrary precision decimals. - Copyright (C) 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -133,16 +133,27 @@ public class BigDecimal extends Number implements Comparable { throw new IllegalArgumentException("illegal rounding mode: " + roundingMode); - if (scale < 0) - throw new ArithmeticException ("scale is negative: " + scale); + if (newScale < 0) + throw new ArithmeticException ("scale is negative: " + newScale); if (intVal.signum () == 0) // handle special case of 0.0/0.0 return ZERO; - BigInteger dividend = intVal.multiply (BigInteger.valueOf (10).pow - (newScale + 1 - (scale - val.scale))); + // Ensure that pow gets a non-negative value. + int valScale = val.scale; + BigInteger valIntVal = val.intVal; + int power = newScale + 1 - (scale - val.scale); + if (power < 0) + { + // Effectively increase the scale of val to avoid an + // IllegalArgumentException for a negative power. + valIntVal = valIntVal.multiply (BigInteger.valueOf (10).pow (-power)); + power = 0; + } + + BigInteger dividend = intVal.multiply (BigInteger.valueOf (10).pow (power)); - BigInteger parts[] = dividend.divideAndRemainder (val.intVal); + BigInteger parts[] = dividend.divideAndRemainder (valIntVal); // System.out.println("int: " + parts[0]); // System.out.println("rem: " + parts[1]); @@ -347,4 +358,15 @@ public class BigDecimal extends Number implements Comparable { { return Double.valueOf(toString()).doubleValue(); } + + public BigDecimal setScale (int scale) throws ArithmeticException + { + return setScale (scale, ROUND_UNNECESSARY); + } + + public BigDecimal setScale (int scale, int roundingMode) + throws ArithmeticException, IllegalArgumentException + { + return divide (ONE, scale, roundingMode); + } } |