需要一些帮助来计算每月固定月付款额(P),以每月i的利率在n个月内完全摊还L美元贷款。给定的公式是:P = L [i(1 + i)n] / [(1 + i)n-1]。我写了一个代码,但它没有计算付款。我想知道是不是因为我使用双重类型与int(数月)或公式的问题?!请帮忙。
#include<stdio.h>
#include <math.h>
double calculatePayments(double rate, double loan, int payments);
int main() {
double principal, i, monthlyP;
int month;
printf ("Enter the principal amount: ");
scanf ("%f", &principal);
printf ("Enter the interest amount: ");
scanf ("%f", &i);
printf ("Enter the term in months: ");
scanf ("%d", &month);
monthlyP = calculatePayments (i, principal, month);
printf ("The monthly payment amount is %.2f: ", monthlyP);
return 0;
}
double calculatePayments(double rate, double loan, int payments) {
double mPayments;
mPayments = loan*(rate*(1 + rate)*payments)/((1 + rate)*payments - 1);
return mPayments;
}
答案 0 :(得分:1)
scanf()
的{{1}}个请求%f
格式;它应该是double
。
答案 1 :(得分:1)
除了需要修改输入(%lf
而不是%f
双打)之外,我认为您的付款公式是错误的:由于未来货币价值呈指数级增长,公式应该具有特色把数字提高到一定的权力,但事实并非如此。
正确的公式如下(from here):
由于贷款需要完全还清,FV
等于零。
由于pow(i+1, n)
被使用了两次,因此最好一次计算它,并在两个地方使用结果变量。此计算的最终版本如下所示:
double calculatePayments(double rate, double loan, int payments) {
double mul = pow(1+rate, payments);
return (loan * mul * rate) / (mul - 1);
}
Demo on ideone以每月0.004%的价格计算10万美元的付款,为期30年,为524.67美元,与excel的PMT函数返回值相同。
注意:当您在公式和其他计算器中输入5.6%
的费率时,请不要忘记您的公式采用的是每月费率,而不是每年。因此,您插入外部计算器的速率必须是您输入计算器的12倍(每年5.6%,您应输入0.00466666
答案 2 :(得分:0)
调试的第一个规则之一是确保打印输入以确保程序获得您期望的值。它没有,因为你写道:
scanf ("%f", &principal);
由于principal
是double
,格式必须为"%lf"
。重复利率。您还应该检查输入是否成功:
if (scanf("%lf", &principal) != 1)
{
fprintf(stderr, "Failed to read principal\n");
return(1);
}
如果你打印出输入值,你就会立刻知道出了什么问题。
答案 3 :(得分:0)
阅读dasblinkenlight所说的内容。 此外,
修复您的声明以及您使用scanf()
的变量。
principal
应为loan
。 month
应为payments
。
i
没问题。您需要计算给定百分比的每月十进制数。
例如,
interest = (i/100) /12;
在功能调用之前执行此操作。然后基本上只使用主要底部的dasblinkenlight函数。
希望你得分“10”;)