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

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;
}

修改说明

  1. 修正固定本金计算:将money强制转为double后再做除法,保留完整的小数部分,确保每月固定本金的精确值。
  2. 迭代跟踪剩余本金:用remaining_principal变量实时更新剩余本金,每次仅减去当月固定本金,避免多次浮点运算的累积误差,计算结果更准确。

运行修正后的代码,输入1000000000 0.11 10即可得到预期输出:1554583333.33 554583333.33。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:36:02