Link to home
Start Free TrialLog in
Avatar of infinidem
infinidemFlag for United States of America

asked on

Multiplication accurary

Hi,

working on a simple problem and wanted to get some ideas of the best way around it.  Essentially I want to solve the following problem:

$0.75 * 120%

The answer is $0.90.

I have tried the following:

		BigDecimal bd1 = new BigDecimal(.75);
		BigDecimal bd2 = new BigDecimal(.2);
		BigDecimal bd3 = new BigDecimal(1);
		
		System.out.println( bd1.multiply(bd2.add(bd3)));
		
		System.out.println( 0.75 * ( 1 + 0.20) );

		System.out.println( .75d *  1.2d );
		
		System.out.println( .75d / 5d * 6d);
		
		System.out.println( 75d * 1.2d /100d);
		
		System.out.println( .75d * (( 1d + 0.2d) * 100d)/100d );

Open in new window


With the following output:

0.90000000000000000832667268468867405317723751068115234375
0.8999999999999999
0.8999999999999999
0.8999999999999999
0.9
0.9

Avatar of for_yan
for_yan
Flag of United States of America image


Look at this recent question with solution:

https://www.experts-exchange.com/questions/27240925/how-to-round.html?sfQueryTermInfo=1+10+30+bigdecim+yan

  BigDecimal federalTaxableEarnings =  new BigDecimal(40.0276);
 federalTaxableEarnings = federalTaxableEarnings.setScale(2, RoundingMode.HALF_UP);
        System.out.println("earning: " + federalTaxableEarnings);

Open in new window

I think it should be like that for your code:

BigDecimal bd4 = bd1.multiply(bd2.add(bd3));
bd4 = bd4.setScale(2,RoundingMode.HALF_UP);
 System.out.println("bd4: " + bd4);

Let me test.

Yes, this worked for me:
BigDecimal bd1 = new BigDecimal(.75);
		BigDecimal bd2 = new BigDecimal(.2);
		BigDecimal bd3 = new BigDecimal(1);

		
        BigDecimal bd4 = bd1.multiply(bd2.add(bd3));
        bd4 = bd4.setScale(2,RoundingMode.HALF_UP);
         System.out.println("bd4: " + bd4);
         

Open in new window


Output:
bd4: 0.90

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Frosty555
Frosty555
Flag of Canada image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of infinidem

ASKER

The answer is given to two parts as the explanation that a decimal can not be accurately represented via binary and that the constructors for BidDecimal should be with more accuracy.  Thanks Everyone.