ACz
ACz

Reputation: 577

Subtract and round double values by multiplier

I have two double values

double a = 1.07522;
double b = 1.0752;

and rounding multiplier value

public static final double ROUND_MULTIPLIER = 100000.0;

So there always should be 5 decimal places.

I need to subtract two double values and get result as a - b = 0.00002.

How can I do this with using ROUND_MULTIPLIER ?

I tried using BigDecimal as

BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).round(new MathContext((int)ROUND_MULTIPLIER)); 

but it not always works, sometimes return 2E-16, it returns weird value when try add to second value as below

BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b + 0.00002)).round(new MathContext((int)ROUND_MULTIPLIER));

I need to use ROUND_MULTIPLIER.

Upvotes: 0

Views: 2417

Answers (4)

Korashen
Korashen

Reputation: 2191

I don't understand why you must use ROUND_MULTIPLYER and what the exact reason of it's existance is, so I can only guess.

Forcing the code to use ROUND_MULTIPLYER:

public static final double ROUND_MULTIPLIER = 100000.0;

public void foobar()
{
    double a = 1.07522;
    double b = 1.0752;

    BigDecimal opA = BigDecimal.valueOf(a);
    BigDecimal opB = BigDecimal.valueOf(b);

    BigDecimal result = opA.subtract(opB);

    result = result.multiply(BigDecimal.valueOf(ROUND_MULTIPLIER));

    int cutResult = result.intValue();

    result = BigDecimal.valueOf(cutResult / ROUND_MULTIPLIER);

    System.out.println(result);
}

The output of this is

 0.000020

Is that what you want? The code is definitly object to optimization, but I let that up to you to do ;-)

Upvotes: 1

Nikolas
Nikolas

Reputation: 2410

BigDecimal is the way to go, but why is the ROUND_MULTIPLIER a double value if you cast it to int anyways. Maybe that is where you get your rounding issues from? Give it a spin with an int-multiplier :)

Edit: using setScale() setting a proper rounding mode is usually a better choice, but you insist on using the multiplier, right?

Upvotes: 0

shreyansh jogi
shreyansh jogi

Reputation: 2102

 BigDecimal decimal = new BigDecimal(1.07522);
 BigDecimal decimal1 = new BigDecimal(1.0752);
 System.out.println(decimal.subtract(decimal1).setScale(5, RoundingMode.DOWN));

Upvotes: 0

Use bigDEcimal and set the scale giving the number of decimals you need

    final BigDecimal a = new BigDecimal(1.07522);
    final BigDecimal b = new BigDecimal(1.0752);
    final BigDecimal result = a.subtract(b);
    int newScale = 10; //10 decimals
    System.out.println(result.setScale(newScale, BigDecimal.ROUND_UP));

Upvotes: 0

Related Questions