Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which method will be better when multiply 100 with BigDecimal?

Here I have a question when using Java BigDecimal. Which way will be better when I want to multiply 100 for a object of BigDecimal.

  1. multiply 10 twice;
  2. movePointRight(2);
  3. scaleByPowerOfTen(2);
  4. any other way? please show me if there is.

BTW, it will be used for commercial calculation, so I'm considering the precision rather than the speed.

like image 258
Eric.Q Avatar asked Jan 23 '14 02:01

Eric.Q


People also ask

How do you multiply BigDecimal values?

BigDecimal multiply() Method in Javascale() + multiplicand. scale()). Parameters: This method accepts a single parameter multiplicand of BigDecimal type which refers to the Value to be multiplied by this BigDecimal. Return value: This method returns a BigDecimal whose value this * multiplicand.

Which is more accurate BigDecimal or double?

A BigDecimal is an accurate way of expressing numbers. A Double has a reliable accuracy. Going with doubles of various magnitudes (say d1=1000.0 and d2=0.001) could occur in the 0.001 being dropped collectively when summing as the variation in magnitude is so large. With BigDecimal this would not occur.

How much slower is BigDecimal than double?

According to my own benchmarking for my specific use case it's 10 - 20x slower than double (much better than 1000x) - basically for addition / multiplication.

Why would you use BigDecimal over float?

BigDecimal provides full control over the precision and rounding of the number value. Virtually, it's possible to calculate the value of pi to 2 billion decimal places using BigDecimal, with available physical memory being the only limit.


1 Answers

Option 3 is the fastest. Options 1 and 2 are roughly the same (option one being to multiply by ten twice). Multiplying by 100 instead gets up near the speed of option 3.

Here's my test code:

import java.math.BigDecimal;

public class TestingStuff {

    public static void main(String[] args){
        BigDecimal d2 = new BigDecimal(0); // to load the big decimal class outside the loop
        long start = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++) {
            BigDecimal d = new BigDecimal(99);
            d2 = d.movePointRight(2);
        }
        long end = System.currentTimeMillis();
        System.out.println("movePointRight: " + (end - start));

        BigDecimal ten = new BigDecimal(10);
        start = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++) {
            BigDecimal d = new BigDecimal(99);
            d2 = d.multiply(ten).multiply(ten);
        }
        end = System.currentTimeMillis();
        System.out.println("multiply: " + (end - start));

        start = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++) {
            BigDecimal d = new BigDecimal(99);
            d2 = d.scaleByPowerOfTen(2);
        }
        end = System.currentTimeMillis();
        System.out.println("scaleByPowerOfTen: " + (end - start));
    }

}

Of course you could just try the various options yourself in your own code. If you can't measure the difference, then why are you optimizing?

like image 104
Jason Avatar answered Sep 25 '22 22:09

Jason