summaryrefslogtreecommitdiff
path: root/java/math/BigDecimal.java
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2003-08-01 12:44:08 +0000
committerMark Wielaard <mark@klomp.org>2003-08-01 12:44:08 +0000
commit6e713e9f7aab8608fc8b1021ea5b532497db4c4f (patch)
tree48c077b977d4a32b3c42b6881f9948858438d7f2 /java/math/BigDecimal.java
parent9a4ab201f33ab2c56affdc61a4744858ba77afab (diff)
downloadclasspath-6e713e9f7aab8608fc8b1021ea5b532497db4c4f.tar.gz
* java/math/BigDecimal.java (divide): Calculate sign correctly. And
optimize checks againsts sign and half values.
Diffstat (limited to 'java/math/BigDecimal.java')
-rw-r--r--java/math/BigDecimal.java25
1 files changed, 12 insertions, 13 deletions
diff --git a/java/math/BigDecimal.java b/java/math/BigDecimal.java
index f10a47b5a..f9965add4 100644
--- a/java/math/BigDecimal.java
+++ b/java/math/BigDecimal.java
@@ -285,8 +285,6 @@ public class BigDecimal extends Number implements Comparable
BigInteger dividend = intVal.multiply (BigInteger.valueOf (10).pow (power));
BigInteger parts[] = dividend.divideAndRemainder (valIntVal);
-// System.out.println("int: " + parts[0]);
-// System.out.println("rem: " + parts[1]);
BigInteger unrounded = parts[0];
if (parts[1].signum () == 0) // no remainder, no rounding necessary
@@ -295,32 +293,34 @@ public class BigDecimal extends Number implements Comparable
if (roundingMode == ROUND_UNNECESSARY)
throw new ArithmeticException ("newScale is not large enough");
- int sign = unrounded.signum ();
+ int sign = intVal.signum () * valIntVal.signum ();
if (roundingMode == ROUND_CEILING)
- roundingMode = (sign == 1) ? ROUND_UP : ROUND_DOWN;
+ roundingMode = (sign > 0) ? ROUND_UP : ROUND_DOWN;
else if (roundingMode == ROUND_FLOOR)
- roundingMode = (sign == 1) ? ROUND_DOWN : ROUND_UP;
+ roundingMode = (sign < 0) ? ROUND_UP : ROUND_DOWN;
else
{
// half is -1 if remainder*2 < positive intValue (*power), 0 if equal,
// 1 if >. This implies that the remainder to round is less than,
// equal to, or greater than half way to the next digit.
- BigInteger posRemainder = sign == -1 ? parts[1].negate() : parts[1];
+ BigInteger posRemainder
+ = parts[1].signum () < 0 ? parts[1].negate() : parts[1];
+ valIntVal = valIntVal.signum () < 0 ? valIntVal.negate () : valIntVal;
int half = posRemainder.shiftLeft(1).compareTo(valIntVal);
-
+
switch(roundingMode)
{
case ROUND_HALF_UP:
- roundingMode = (half == -1) ? ROUND_DOWN : ROUND_UP;
+ roundingMode = (half < 0) ? ROUND_DOWN : ROUND_UP;
break;
case ROUND_HALF_DOWN:
- roundingMode = (half == 1) ? ROUND_UP : ROUND_DOWN;
+ roundingMode = (half > 0) ? ROUND_UP : ROUND_DOWN;
break;
case ROUND_HALF_EVEN:
- if (half == -1)
+ if (half < 0)
roundingMode = ROUND_DOWN;
- else if (half == 1)
+ else if (half > 0)
roundingMode = ROUND_UP;
else if (unrounded.testBit(0)) // odd, then ROUND_HALF_UP
roundingMode = ROUND_UP;
@@ -331,8 +331,7 @@ public class BigDecimal extends Number implements Comparable
}
if (roundingMode == ROUND_UP)
- return new BigDecimal (unrounded.add (BigInteger.valueOf
- (sign != 0 ? sign : 1)), newScale);
+ unrounded = unrounded.add (BigInteger.valueOf (sign > 0 ? 1 : -1));
// roundingMode == ROUND_DOWN
return new BigDecimal (unrounded, newScale);