2015-04-13 2 views
0

В настоящее время я пытаюсь разработать сложный калькулятор процентов, который включает ежемесячные взносы. Я успешно смог получить составной процентный расчет, работающий без ежемесячных взносов, используя следующую строку кода, но не могу понять, какая формула должна быть при добавлении ежемесячных взносов.java compound interest with взносы формула

double calculatedValue = (principalValue * Math.pow(1 + (interestRateValue/numberOfCompoundsValue), (termValue * numberOfCompoundsValue))); 

При попытке получить расчетное значение с помощью взносов я изменил способ, которым это делается. Посмотрите следующий код, как я подошел к этому.

//The starting principal 
double principalValue = 5000; 

//Interest rate (%) 
double interestRateValue = 0.05; 

//How many times a year to add interest 
int numberOfCompoundsValue = 4; 

//The number of years used for the calculation 
double termValue = 30; 

//The monthly contribution amount 
double monthlyContributionsValue = 400; 

//How often interest is added. E.g. Every 3 months if adding interest 4 times in a year 
int interestAddedEveryXMonths = 12/numberOfCompoundsValue; 

//The total number of months for the calculation 
int totalNumberOfMonths = (int)(12 * termValue); 

    for(int i = 1; i <= totalNumberOfMonths; i++) 
    { 

     principalValue += monthlyContributionsValue; 

     if(i % interestAddedEveryXMonths == 0) 
     { 
      principalValue += (principalValue * interestRateValue); 
     } 
    } 

Я понял, что это должно делать то, что я за. Каждый месяц увеличивайте основную сумму на сумму взноса, и если этот месяц равен месяцу, в который должен быть добавлен процент, затем рассчитать процентную ставку * процентную ставку и добавить ее к основному лицу.

При использовании приведенных выше значений я ожидаю ответ $ 355,242.18, но получаю $ 10511941.97, что выглядит лучше на моем банковском счете, но не в моих расчетах.

Если кто-нибудь может предложить мне какую-то помощь или указать, где я поступил неправильно, это было бы очень признательно.

Заранее спасибо

+1

Попытка отладки вы будете знать, где проблема –

+0

я отлажена это и все выглядело, как это делает, как надо, помимо Я не был уверен, что точные значения, которые должны быть рассчитаны на каждой итерации. Должно быть что-то действительно очевидное, что мне не хватает, слишком долго смотревший на код. –

ответ

1

Ваша проблема здесь:

principalValue += (principalValue * interestRateValue); 

Вы добавляя интерес полный год в каждый квартал, когда вы должны добавлять интерес только четверть в. Вам нужно уменьшить эту процентную ставку, чтобы получить правильную ставку.

Вот пример:

class CashFlow { 
    private final double initialDeposit; 
    private final double rate; 
    private final int years; 
    private final double monthlyContribution; 
    private final int interestFrequency; 

    CashFlow(double initialDeposit, double rate, int years, 
      double monthlyContribution, int interestFrequency) { 
     if (years < 1) { 
      throw new IllegalArgumentException("years must be at least 1"); 
     } 

     if (rate <= 0) { 
      throw new IllegalArgumentException("rate must be positive"); 
     } 

     if (12 % interestFrequency != 0) { 
      throw new IllegalArgumentException("frequency must divide 12"); 
     } 

     this.initialDeposit = initialDeposit; 
     this.rate = rate; 
     this.years = years; 
     this.monthlyContribution = monthlyContribution; 
     this.interestFrequency = interestFrequency; 
    } 

    public double terminalValue() { 
     final int interestPeriod = 12/interestFrequency; 
     final double pRate = Math.pow(1 + rate, 1.0/interestPeriod) - 1; 
     double value = initialDeposit; 

     for (int i = 0; i < years * 12; ++i) { 
      value += monthlyContribution; 

      if (i % interestFrequency == interestFrequency - 1) { 
       value *= 1 + pRate; 
      } 
     } 

     return value; 
    } 
} 

class CompoundCalc { 

    public static void main(String[] args) { 
     CashFlow cf = new CashFlow(5000, 0.05, 30, 400, 3); 
     System.out.println("Terminal value: " + cf.terminalValue()); 
    } 
} 

с выходом:

run: 
Terminal value: 350421.2302849443 
BUILD SUCCESSFUL (total time: 0 seconds) 

что близко к значению $ 355K вы нашли.

Существует несколько различных соглашений, которые вы можете использовать для получения квартальной ставки. Разделение годовой ставки на 4 является простым и практичным, но метод pow(1 + rate, 1/4) - 1 выше более теоретически обоснован, так как он математически эквивалентен соответствующему годовому показателю.

0

После некоторого краткого тестирования я пришел к выводу, что либо у вас есть:

  • рассчитали значение, которое вы хотите ($ 355,242.18)

    ИЛИ

  • неверно задали ваш вопрос

Расчет, который вы описали, что вы хотите (5000 долларов США за начало + 400 долларов США ежемесячные взносы на 30 лет + проценты каждые 3 месяца), определяется кодом, который вы предоставили. Значение, которое он дает (10 511 941,97 долларов), действительно является правильным из того, что я вижу. Единственные другие предложения, которые я могу предложить, чтобы использовать только double, если вам нужно (например termValue может быть int) И когда все вы знаете, что значение не изменится (например interestRateValue) используют final. Это поможет избежать любой непредвиденной ошибки в более крупных программах. Надеюсь, это поможет вам разобраться в калькуляторе своих интересов или ответить на любые ваши вопросы.

+1

Спасибо, Пол за ваш вклад. Ответ, который я ожидал, пришел из онлайн-калькулятора процентных процентов, так что предполагалось, что это было правильно по сравнению с тем, что я на самом деле получил. Значения, которые я установил, теперь жестко закодированы, но будут введены пользователем на более позднем этапе. Например, пользователь может ввести 1,5 года. Я буду держать ваши предложения в виду, поскольку я продолжаю, хотя. Спасибо. –

+1

@ShaunD Нет проблем! Я рад, что вы это поняли. Я думал, что вы планируете реализовать эту переменную позже. Если вы хотите пометить мой ответ как «правильный», который удержит людей от попыток ответить в будущем :) –

+0

Значение $ 10m, безусловно, неверно. Правильная будущая стоимость действительно очень близка к 355 000 долларов. –

0
static void Main(string[] args) 
     { 
      double monthlyDeposit; 
      double rateOfInterest; 
      double numberOfCompounds; 
      double years; 
      double futureValue = 0; 
      double totalAmount = 0; 
Console.WriteLine("Compound Interest Calculation based on monthly deposits"); 
      Console.WriteLine("Monthly Deposit"); 
      monthlyDeposit = Convert.ToDouble(Console.ReadLine()); 
      Console.WriteLine("Rate Of Interest"); 
      rateOfInterest = Convert.ToDouble(Console.ReadLine()); 
      Console.WriteLine("Number of Compounds in a year"); 
      numberOfCompounds = Convert.ToDouble(Console.ReadLine()); 
      Console.WriteLine("Number of year"); 
      years = Convert.ToDouble(Console.ReadLine()); 
      futureValue = monthlyDeposit; 
      for (int i = 1; i <= years * 12; i++) 
      { 
       totalAmount = futureValue * (1 + (rateOfInterest/100)/12); 
       if (i == years * 12) 
        futureValue = totalAmount; 
       else 
        futureValue = totalAmount + monthlyDeposit; 
      } 
      Console.WriteLine("Future Value is=" + futureValue); 
      Console.ReadLine(); 

     } 

     //Output 
     Compound Interest Calculation based on monthly Deposits 
     Monthly Deposit 
     1500 
     Rate Of Interest 
     7.5 
     Number of Compounds in a year 
     12 
     Number of year 
     1 
     Future Value is=18748.2726237313 
Смежные вопросы