I am puzzled by Java Bigdecimal behavior.
Let's say I have dividend = 3
and divisor = 23
.
first divide 3/23 = 0.130434783
Once I multiply 0.130434783 * 23
I should get 3
.
Bigdicimal gives a different result for a different number. Is there any way to achieve a consistent result?
I have tried with multiple combinations of numbers. some times it gives correct result some time does not
public static void main(String[] args) {
MathContext context = new MathContext(4, RoundingMode.HALF_UP);
BigDecimal dividend = new BigDecimal(3);
BigDecimal divisor = new BigDecimal(23);
BigDecimal ratio = dividend.divide(divisor, context);
System.out.println("Ratio :" + ratio);
Double ratioInDouble = ratio.doubleValue();
System.out.println(ratio.toEngineeringString());
BigDecimal ans = (new BigDecimal(ratio.toEngineeringString()).multiply(divisor));
System.out.println("Engineering String :" + ans);
System.out.println(ratio.multiply(divisor, context));
System.out.println(BigDecimal.valueOf(ratioInDouble).multiply(divisor, context));
System.out.println("HALF_UP :" + BigDecimal.valueOf(ratioInDouble).multiply(divisor, new MathContext(4, RoundingMode.HALF_UP)));
System.out.println("HALF_DOWN :" + BigDecimal.valueOf(ratioInDouble).multiply(divisor, new MathContext(4, RoundingMode.HALF_DOWN)));
System.out.println("CEILING :" + BigDecimal.valueOf(ratioInDouble).multiply(divisor, new MathContext(4, RoundingMode.CEILING)));
System.out.println("DOWN :" + BigDecimal.valueOf(ratioInDouble).multiply(divisor, new MathContext(4, RoundingMode.DOWN)));
System.out.println("UP :" + BigDecimal.valueOf(ratioInDouble).multiply(divisor, new MathContext(4, RoundingMode.UP)));
}
Output
Ratio :0.1304
Multiplication :69
0.1304
Engineering String :2.9992
2.999
2.999
HALF_UP :2.999
HALF_DOWN :2.999
CEILING :3.000
DOWN :2.999
UP :3.000
Just mul :2.9992