具有贡献公式的java复利

时间:2015-04-13 02:34:16

标签: java formula

我目前正在尝试开发包含每月捐款的复利计算器。我已成功地使用以下代码行获得复利计算而没有月度贡献,但无法确定添加月度贡献时应该是什么公式。

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,这在我的银行帐户中看起来更好,但在我的计算中却没有。

如果有人能给我一些帮助或者指出我哪里出错了会非常感激。

提前致谢

3 个答案:

答案 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方法在理论上更合理,因为它在数学上等于相应的年率。

答案 1 :(得分:0)

经过一些简短的测试后,我得出的结论是:你有:

  • 错误估算了您想要的值($ 355,242.18)

    或者

  • 错误地提出了您的问题

您所描述的计算($ 5000开始+ 30美元每月400美元的贡献+每3个月的利息)可以通过您提供的代码找到。它所给出的价值(10,511,941.97美元)确实是正确的。我可以提供的唯一其他建议是,只有在您需要时才会使用double(例如termValue可以是int值不会改变(例如interestRateValue)使用final。它将有助于避免大型程序中出现任何意外错误。我希望这可以帮助您找出您的兴趣计算器或回答您的任何问题。

答案 2 :(得分:0)

.B