按月复利加月缴的余额计算代码结果错误,求修正
修正按月复利+每月存款的投资余额计算代码
我编写的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
相关产品推荐
相关产品推荐

