You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按月复利加月缴的余额计算代码结果错误,求修正

修正按月复利+每月存款的投资余额计算代码

我编写的C++代码用于计算按月复利且每月存入的年度投资余额,但返回结果不符合预期。示例参数:初始投资1869.57,月存款14,利率9.50%,期限19年,预期返回值为20193.81,实际返回20264.33。试过网上的公式但未成功,求修正代码。

原代码:

#include <iomanip>
#include <iostream>

double balanceWithMonthlyDeposit(double initialInvestment, double monthlyDeposit,
                                 double interestRate, int numberOfYears)
{
    double interestEarned;
    double previousBalance = initialInvestment;  // Principal
    double interest = (interestRate / 100.0) / 12.0;  // Convert interest rate to decimal


    for (int i = 0;  i < numberOfYears;  ++i) { // For each year
        double yearlyInterest = 0;
        for (int j = 0;  j < 12;  ++j) { // For each month
            interestEarned = previousBalance + monthlyDeposit;
            interestEarned = interestEarned * interest;
            yearlyInterest = yearlyInterest + interestEarned;
            previousBalance = previousBalance + monthlyDeposit + interestEarned;


        }

        std::cout << "Year " << i + 1 << ": earning "
                  << interestEarned << "/month; "
                  << "(total=" << yearlyInterest << "); "
                  << "balance now " << previousBalance
                  << '\n';
    }

    return previousBalance;
    // return the ending balance
}


int main()
{
    std::cout << std::fixed << std::setprecision(2);
    double balance = balanceWithMonthlyDeposit(1869.57, 14, 9.50, 19);
    std::cout << "Final result = " << balance << '\n';
}

问题分析

原代码的核心错误是当月存款被计入了当月计息的基数,也就是每月先存入存款再计算利息,这会导致计息金额偏高,最终结果比预期大。而预期的计算规则应该是:仅对当月初的余额计算利息,月末再存入当月存款(即当月存款不计入当月利息计算)。

修正后的代码

#include <iomanip>
#include <iostream>

double balanceWithMonthlyDeposit(double initialInvestment, double monthlyDeposit,
                                 double interestRate, int numberOfYears)
{
    double interestEarned;
    double previousBalance = initialInvestment;
    double interest = (interestRate / 100.0) / 12.0;

    for (int i = 0; i < numberOfYears; ++i) {
        double yearlyInterest = 0;
        for (int j = 0; j < 12; ++j) {
            // 先计算当月利息:仅基于月初余额
            interestEarned = previousBalance * interest;
            yearlyInterest += interestEarned;
            // 加上当月利息
            previousBalance += interestEarned;
            // 再存入当月存款
            previousBalance += monthlyDeposit;
        }

        std::cout << "Year " << i + 1 << ": earning "
                  << interestEarned << "/month; "
                  << "(total=" << yearlyInterest << "); "
                  << "balance now " << previousBalance
                  << '\n';
    }

    return previousBalance;
}

int main()
{
    std::cout << std::fixed << std::setprecision(2);
    double balance = balanceWithMonthlyDeposit(1869.57, 14, 9.50, 19);
    std::cout << "Final result = " << balance << '\n';
}

额外说明

如果修正后结果仍与预期有细微差异,可能是因为实际场景中会对每月利息进行四舍五入(保留两位小数),而代码中使用double进行精确计算。若需要模拟银行的四舍五入规则,可以修改利息计算部分:

// 四舍五入到两位小数
interestEarned = round(previousBalance * interest * 100) / 100.0;

内容的提问来源于stack exchange,提问作者kg333

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:44:59