我目前正在尝试开发包含每月捐款的复利计算器。我已成功地使用以下代码行获得复利计算而没有月度贡献,但无法确定添加月度贡献时应该是什么公式。
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,这在我的银行帐户中看起来更好,但在我的计算中却没有。
如果有人能给我一些帮助或者指出我哪里出错了会非常感激。
提前致谢
答案 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