0

需要一些帮助来计算按月利率 i 在 n 个月内完全摊销 L 美元贷款所需的固定每月付款 (P)。给定的公式是: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;
}
4

4 回答 4

1

您的scanf()请求%f格式为double; 它应该是%lf

于 2013-11-02T02:39:26.257 回答
1

除了需要修复输入(%lf而不是%f双打)之外,我认为您的付款公式是错误的:由于货币的未来价值呈指数增长,因此该公式应具有将数字提高到一定程度的特点,而事实并非如此。

正确的公式如下(来自这里):

PMT公式

由于贷款需要完全还清,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);
}

ideone 上的 Demo以 30 年每月 0.004% 的利率计算 100,000 美元的付款为 524.67 美元,这与 excel 的 PMT 函数返回的值相同。

注意:当您5.6%在公式和另一个计算器中输入费率时,请不要忘记您的公式采用每月的费率,而不是每年的费率。因此,您插入外部计算器的费率必须是您输入计算器的 12 倍(对于每年 5.6%,您应该输入 0.00466666

于 2013-11-02T02:59:56.993 回答
0

阅读 dasblinkenlight 所说的。还,

修复你的声明和你使用的变量scanf()

principal应该是loanmonth应该是payments

i没关系。您需要计算给定百分比的每月十进制数。

例如,

interest = (i/100) /12;

在您的函数调用之前执行此操作。然后基本上在 main 的底部使用 dasblinkenlight 的功能。

希望你得分“10”;)

于 2013-11-02T21:05:55.763 回答
0

调试的首要规则之一是确保您打印输入以确保程序获得您期望的值。它没有,因为你写道:

scanf ("%f", &principal);

既然principal是 a double,格式就必须是"%lf". 重复利率。您还应该检查输入是否成功:

if (scanf("%lf", &principal) != 1)
{
    fprintf(stderr, "Failed to read principal\n");
    return(1);
}

如果您打印出输入值,您就会立即知道出了什么问题。

于 2013-11-02T02:39:57.427 回答