Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6819773

BigDecimal.divide(BigDecimal,int,int) throws ArrayIndexOutofBoundsException under some circumstances

    Details

    • Subcomponent:
    • Introduced In Build:
      b03
    • Introduced In Version:
    • Resolved In Build:
      b04
    • CPU:
      generic
    • OS:
      generic

      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)

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                xlu Xiaobin Lu (Inactive)
                Reporter:
                xlu Xiaobin Lu (Inactive)
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:
                  Imported:
                  Indexed: