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

BigDecimal.divide is busted

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P4 P4
    • None
    • 8u31, 9
    • core-libs
    • x86
    • windows_8

      FULL PRODUCT VERSION :
      java version "1.8.0_31"
      Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
      Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Version 6.3.9600

      A DESCRIPTION OF THE PROBLEM :
      BigDecimal.divide() throws an arithmetic exception regardless of the precision and rounding mode of the arguments. Error is

      Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
      at java.math.BigDecimal.divide(BigDecimal.java:1690)
      at em.EM.testDivide(EM.java:37)
      at em.EM.main(EM.java:42)
      Java Result: 1

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      import java.math.BigDecimal;
      import static java.math.MathContext.DECIMAL128;
      public class EM {

        private static void testDivide(){
          int divisor = 147_579;
          double dividend = 1530.5913281688415;
          BigDecimal bdDividend = new BigDecimal("1530.591328167000", DECIMAL128);
          double quotient = dividend / divisor;
          BigDecimal bdQuotient = bdDividend.divide(new BigDecimal( divisor, DECIMAL128));
          System.out.printf("%11.9f; %11.9f", quotient, bdQuotient);
          System.exit(4);
        }

       public static void main(String[] args) {
           testDivide();
      }
      }

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      quotient = 1530.591328167000/147_579
      ACTUAL -
      Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
      at java.math.BigDecimal.divide(BigDecimal.java:1690)
      at em.EM.testDivide(EM.java:37)
      at em.EM.main(EM.java:42)
      Java Result: 1

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
      at java.math.BigDecimal.divide(BigDecimal.java:1690)
      at em.EM.testDivide(EM.java:37)
      at em.EM.main(EM.java:42)
      Java Result: 1

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.math.BigDecimal;
      import static java.math.MathContext.DECIMAL128;
      public class EM {

        private static void testDivide(){
          int divisor = 147_579;
          double dividend = 1530.5913281688415;
          BigDecimal bdDividend = new BigDecimal("1530.591328167000", DECIMAL128);
          double quotient = dividend / divisor;
          BigDecimal bdQuotient = bdDividend.divide(new BigDecimal( divisor, DECIMAL128));
          System.out.printf("%11.9f; %11.9f", quotient, bdQuotient);
          System.exit(4);
        }

       public static void main(String[] args) {
           testDivide();
      }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      There is no workaround, except possibly drink.

            darcy Joe Darcy
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: