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.
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.