Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Getting incorrect result when using floor() while calculating compount interest

In my code, I use the well-known formula for calculating compound interest. I used floor() for every element in the result, but I got an unexpected result, i.e.
for 6 months I got [1300, 1690, 2197, 2856, 3712, 4826] where the last number should be 4825, if calculating manually every time skipping decimals (what floor() actually should do in my loop but it doesn’t for the last number).

The question is why? How overcome this "error"?

Here is my code:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

from math import floor

def get_plan(current_production: int, month: int, percent: int):

    monthly_production = []
    for i in range(1, month + 1):
        #calculating percentage using compound interest formula
        monthly_production.append(floor(current_production * (1 + percent / 100) ** i))
    return monthly_production 

get_plan(1000, 6, 30)

>Solution :

Substituting the given values you get 1000 * (1 + 30 / 100) ** 6 which is 4826.809000000001 in floats and correctly floored to 4826. I suppose the issue is that your intermediate results aren’t floored: When you calculate it manually, you say you "throw away the decimals from every result" (after every step).

To fix this in your Python code, simply don’t use float exponentiation which doesn’t floor after every multiplication but instead multiply with the interest in each step:

from math import floor

def get_plan(current_production: int, month: int, percent: int):
    monthly_production = []
    for i in range(1, month + 1):
        #calculating percentage using compound interest formula
        current_production = floor(current_production * (1 + percent / 100))
        monthly_production.append(current_production)
    return monthly_production 

get_plan(1000, 6, 30) correctly yields [1300, 1690, 2197, 2856, 3712, 4825] then.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading