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
 
    