This discussion is archived
4 Replies Latest reply: Apr 7, 2013 2:49 PM by rp0428 RSS

BigDecimal and POW

Zabo Newbie
Currently Being Moderated
Hello

In the following example, I compute new_amount_d in 2 different ways and I get 2 different values although it should be the same in theory.

Is there a way to get the same value with BigDecimal for instance ?

I'm new to Java and I'm working for financial industry...that's why I'm trying to solve this problem.

Thanks for helping.


public class num004
{
public static void main(String[] args)
{          
          
          double amount_d = 1000;
          double interest_rate_d = 0.03;
          double new_amount_d = amount_d;
for(int i = 0;i<365;i++)
          {          
          new_amount_d = new_amount_d * Math.pow(1+interest_rate_d,(double)1/365);
          }
          System.out.println("new amount_d :"+new_amount_d);
          
          new_amount_d = amount_d * Math.pow(1+interest_rate_d,(double) 1);
          System.out.println("new amount_d :"+new_amount_d);          
                    
          }
}
  • 1. Re: BigDecimal and POW
    TPD-Opitz-Consulting-com Expert
    Currently Being Moderated
    please add
     tags around your samples when posting here...
    
    The wrong result is cause by your double values.
    native decimal numbers are not precise because of two resons:
    <ol><li>there is s limmited number of bits/bytes to represent the value.
    <li>binary representation used by the Computer differs from human readable decimal format in that way that some decimal fractions form entless binary fractions, wich connot be represented due to leck of bits/bytes
    </ol>
    Use only <tt>BigDecimal</tt> objects and their methods for calulation.
    
    bye
    TPD                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  • 2. Re: BigDecimal and POW
    Zabo Newbie
    Currently Being Moderated
    OK, according to what I red, I understood that BigDecimal is the solution.

    But, How to compute power( BigDecimal, 1/365) ?

    In the API, I saw only power(BigDecimal,int).
  • 3. Re: BigDecimal and POW
    TPD-Opitz-Consulting-com Expert
    Currently Being Moderated
    Zabo wrote:
    OK, according to what I red, I understood that BigDecimal is the solution.

    But, How to compute power( BigDecimal, 1/365) ?

    In the API, I saw only power(BigDecimal,int).
    http://en.wikipedia.org/wiki/Exponentiation#Arbitrary_integer_exponents
    And since you're a lucky guy there's a lib for you:
    http://krum.rz.uni-mannheim.de/jas/

    bye
    TPD
  • 4. Re: BigDecimal and POW
    rp0428 Guru
    Currently Being Moderated
    >
    In the following example, I compute new_amount_d in 2 different ways and I get 2 different values although it should be the same in theory.
    >
    No - those would NEVER be the same in theory or in practice since they use two vastly different formulas.
    new_amount_d = new_amount_d * Math.pow(1+interest_rate_d,(double)1/365);
    . . .
    new_amount_d = amount_d * Math.pow(1+interest_rate_d,(double) 1);
    The second line of code uses an exponent of '1' which means it doesn't compute a 'power' at all. Anything raised to the power of '1' is just the same value. The first example uses '1/365' as the exponent and that is way different than the '1' used in the second example.
    >
    I'm new to Java and I'm working for financial industry...that's why I'm trying to solve this problem.
    >
    Then start over and tell what the actual problem is that you are trying to solve.

    What are you trying to compute? What financial formula are you trying to use?

    Forget your code and provide an example, in English, showing:

    1. the input values
    2. what you are trying to compute
    3. the expected output values.

    Then someone can try to help you find the best way to do that.

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points