C语言入门数组问题:房贷计算程序输出与预期不符求调试
问题排查:固定利率房贷计算程序输出偏差
问题描述
需求为计算固定利率房贷的总月供金额及与初始贷款额的差值,规则如下:
- 每月固定本金 = 初始贷款额 ÷ (贷款年限 × 12)
- 月利息基于当月剩余本金计算
输入示例:1000000000 0.11 10,预期输出:1554583333.33 554583333.33,但当前代码运行输出为1554583315.15 554583315.15,存在偏差。
代码问题分析
1. 固定本金计算的精度丢失
原代码中fixed_money = money/(year*12)是整数除法:
money是long long类型,year*12是int类型,两者运算时会执行整数除法,直接舍去小数部分。- 以输入示例为例,
1000000000/(10*12)的精确值是8333333.333...,但整数除法结果为8333333,转成double后丢失了小数部分,导致后续所有月供计算的基础值错误。
2. 剩余本金计算的累积浮点误差
原代码用money - i*fixed_money计算剩余本金,每次循环都依赖之前的fixed_money累积计算,浮点数的精度误差会随着循环次数增多不断放大,进一步偏离真实值。
修正后的代码
#include <stdio.h> int main() { long long int money; double rate; int year; scanf("%lld %lf %d", &money, &rate, &year); // 先将初始贷款额转为double,避免整数除法精度丢失 double fixed_money = (double)money / (year * 12); double total_money = 0; // 用变量跟踪剩余本金,减少累积误差 double remaining_principal = money; for (int i = 0; i < year * 12; i++){ double monthly_interest = remaining_principal * rate / 12; double monthly_payment = fixed_money + monthly_interest; total_money += monthly_payment; // 更新剩余本金:减去当月偿还的固定本金 remaining_principal -= fixed_money; } printf("%.2lf %.2lf", total_money, total_money - money); return 0; }
修改说明
- 修正固定本金计算:将
money强制转为double后再做除法,保留完整的小数部分,确保每月固定本金的精确值。 - 迭代跟踪剩余本金:用
remaining_principal变量实时更新剩余本金,每次仅减去当月固定本金,避免多次浮点运算的累积误差,计算结果更准确。
运行修正后的代码,输入1000000000 0.11 10即可得到预期输出:1554583333.33 554583333.33。
内容的提问来源于stack exchange,提问作者NgoMinh
相关产品推荐
相关产品推荐

