Details
-
Bug
-
Resolution: Fixed
-
P2
-
6u14
Description
java.math.BigDecimal.divide(BigDecimal divisor, int scale, int roundingMode)
throws unspecified ArrayIndexOutOfBoundsException
when roundingMode equals BigDecimal.ROUND_HALF_EVEN
How to reproduce:
-----------------
To reproduce this bug run the following BigDecimalTest
NOTE: the code is copied from Apache license Harmony test.
-------------------BigDecimalTest.java--------
import java.math.*;
import java.math.*;
public class BigDecimalTest {
public static void main(String[] args) {
String dec1 = "-37361671119238118911893939591735";
int scale1 = 10;
String dec2 = "74723342238476237823787879183470";
int scale2 = 15;
int resScale = -5;
BigDecimal decN1 = new BigDecimal(new BigInteger(dec1), scale1);
BigDecimal decN2 = new BigDecimal(new BigInteger(dec2), scale2);
BigDecimal result;
int round = -1;
String sRound = "";
try {
round = BigDecimal.ROUND_HALF_UP;
sRound = "BigDecimal.ROUND_HALF_UP";
result = decN1.divide(decN2, resScale, round);
System.out.println("divide with " + sRound + " passsed. result="
+ result);
round = BigDecimal.ROUND_HALF_DOWN;
sRound = "BigDecimal.ROUND_HALF_DOWN";
result = decN1.divide(decN2, resScale, round);
System.out.println("divide with " + sRound + " passsed. result="
+ result);
round = BigDecimal.ROUND_HALF_EVEN;
sRound = "BigDecimal.ROUND_HALF_EVEN";
result = decN1.divide(decN2, resScale, round);
System.out.println("divide with " + sRound + " passsed. result="
+ result);
} catch (Throwable e) {
System.out.println("divide with " + sRound + " failed");
System.out.println("Unexpected exception was thrown. " + round);
e.printStackTrace(System.out);
}
}
}
------------
Diagnostics/output:
-------------------
Output on 6u14 b03 ia32:
java version "1.6.0_14-ea"
Java(TM) SE Runtime Environment (build 1.6.0_14-ea-b03)
Java HotSpot(TM) Client VM (build 14.0-b12, mixed mode, sharing)
divide with BigDecimal.ROUND_HALF_UP passsed. result=-1E+5
divide with BigDecimal.ROUND_HALF_DOWN passsed. result=0E+5
divide with BigDecimal.ROUND_HALF_EVEN failed
Unexpected exception was thrown. 6
java.lang.ArrayIndexOutOfBoundsException: -1
at java.math.MutableBigInteger.isOdd(Unknown Source)
at java.math.BigDecimal.divideAndRound(Unknown Source)
at java.math.BigDecimal.divide(Unknown Source)
at BigDecimalTest.main(BigDecimalTest.java:30)
throws unspecified ArrayIndexOutOfBoundsException
when roundingMode equals BigDecimal.ROUND_HALF_EVEN
How to reproduce:
-----------------
To reproduce this bug run the following BigDecimalTest
NOTE: the code is copied from Apache license Harmony test.
-------------------BigDecimalTest.java--------
import java.math.*;
import java.math.*;
public class BigDecimalTest {
public static void main(String[] args) {
String dec1 = "-37361671119238118911893939591735";
int scale1 = 10;
String dec2 = "74723342238476237823787879183470";
int scale2 = 15;
int resScale = -5;
BigDecimal decN1 = new BigDecimal(new BigInteger(dec1), scale1);
BigDecimal decN2 = new BigDecimal(new BigInteger(dec2), scale2);
BigDecimal result;
int round = -1;
String sRound = "";
try {
round = BigDecimal.ROUND_HALF_UP;
sRound = "BigDecimal.ROUND_HALF_UP";
result = decN1.divide(decN2, resScale, round);
System.out.println("divide with " + sRound + " passsed. result="
+ result);
round = BigDecimal.ROUND_HALF_DOWN;
sRound = "BigDecimal.ROUND_HALF_DOWN";
result = decN1.divide(decN2, resScale, round);
System.out.println("divide with " + sRound + " passsed. result="
+ result);
round = BigDecimal.ROUND_HALF_EVEN;
sRound = "BigDecimal.ROUND_HALF_EVEN";
result = decN1.divide(decN2, resScale, round);
System.out.println("divide with " + sRound + " passsed. result="
+ result);
} catch (Throwable e) {
System.out.println("divide with " + sRound + " failed");
System.out.println("Unexpected exception was thrown. " + round);
e.printStackTrace(System.out);
}
}
}
------------
Diagnostics/output:
-------------------
Output on 6u14 b03 ia32:
java version "1.6.0_14-ea"
Java(TM) SE Runtime Environment (build 1.6.0_14-ea-b03)
Java HotSpot(TM) Client VM (build 14.0-b12, mixed mode, sharing)
divide with BigDecimal.ROUND_HALF_UP passsed. result=-1E+5
divide with BigDecimal.ROUND_HALF_DOWN passsed. result=0E+5
divide with BigDecimal.ROUND_HALF_EVEN failed
Unexpected exception was thrown. 6
java.lang.ArrayIndexOutOfBoundsException: -1
at java.math.MutableBigInteger.isOdd(Unknown Source)
at java.math.BigDecimal.divideAndRound(Unknown Source)
at java.math.BigDecimal.divide(Unknown Source)
at BigDecimalTest.main(BigDecimalTest.java:30)
Attachments
Issue Links
- duplicates
-
JDK-6820130 BigDecimal.divide(BigDecimal,int,int) throws unspecified ArrayIndexOutOfBoundsException
- Closed
- relates to
-
JDK-6876282 BigDecimal's divide(BigDecimal bd, RoundingFormat r) produces incorrect result
- Closed
-
JDK-6622432 RFE: Performance improvements to java.math.BigDecimal
- Resolved