当前位置:首页>python>用Python计算等额本息和等额本金

用Python计算等额本息和等额本金

  • 2026-10-11 08:28:02
用Python计算等额本息和等额本金

用Python计算房贷的两种还款方式。


先搞清楚两个概念

  • 等额本息:每个月还款总额固定,前期利息多、本金少;后期利息少、本金多。

  • 等额本金:每个月还的本金固定,利息逐月减少,所以月供逐月降低。总利息比等额本息少。

公式需要用到幂运算()**和浮点数,正好复习一下。


等额本息:每月还款一样多

月供公式:

其中:

  • PP = 贷款本金(元)

  • rr = 月利率(年利率÷12)

  • nn = 还款总月数(年数×12)

代码实现

def equal_instalment(principal, annual_rate, years):    """    功能:计算等额本息方式下的月供、总还款额、总利息    参数:        principal : float, 贷款本金(元)        annual_rate : float, 年利率(如0.049表示4.9%)        years : int, 贷款年限    返回值:        monthly_payment : float, 每月固定还款额(元)        total_payment : float, 总还款额(本金+利息)        total_interest : float, 总利息    """    # 月利率 = 年利率 / 12    # 注意:除法结果自动变成浮点数,保留足够精度    monthly_rate = annual_rate / 12    # 总月数 = 年限 × 12    months = years * 12    # 计算 (1 + 月利率) ^ 总月数    # ** 是幂运算符,这里计算的是复利因子    factor = (1 + monthly_rate) ** months    # 等额本息月供公式:    # 月供 = 本金 × [月利率 × (1+月利率)^总月数] / [(1+月利率)^总月数 - 1]    # 注意运算优先级:先乘方,再乘除,最后加减    monthly_payment = principal * monthly_rate * factor / (factor - 1)    # 总还款额 = 月供 × 总月数    total_payment = monthly_payment * months    # 总利息 = 总还款额 - 本金    total_interest = total_payment - principal    # 返回三个值(实际上返回一个元组,Python自动打包)    return monthly_payment, total_payment, total_interest

知识点

  1. ** 幂运算:(1+monthly_rate) ** months 就是计算

    。注意浮点数的幂运算结果可能有微小误差,后面用round()处理即可。

  2. 变量命名:见名知意,principal本金,annual_rate年利率。

  3. 浮点数除法:annual_rate / 12 结果是浮点数,保留足够精度。

  4. 返回值:多个值用逗号分隔,实际上返回一个元组。


等额本金:每月还的本金一样

月供公式:第 kk 个月的月供 = 每月固定本金 + 当月剩余本金产生的利息

其中 kk 从1开始。

代码实现

def equal_principal(principal, annual_rate, years):    """    功能:计算等额本金方式下的首月月供、末月月供、总还款额、总利息    参数同上    返回值:        first_month : float, 第一个月月供        last_month : float, 最后一个月月供        total_payment : float, 总还款额        total_interest : float, 总利息    """    monthly_rate = annual_rate / 12    months = years * 12    # 每月固定偿还的本金 = 总本金 / 总月数    principal_per_month = principal / months    # 创建一个空列表,用来存储每个月的月供(方便以后分析)    monthly_payments = []    # 累计总利息,初始为0    total_interest = 0    # 循环变量 month 从 1 到 months(包含)    # range(1, months+1) 生成 [1, 2, 3, ..., months]    for month in range(1, months + 1):        # 当前月剩余本金 = 总本金 - 已经归还的本金        # 已经归还的本金 = 每月固定本金 × (month-1)        # 注意:month从1开始,第一个月已经归还0元,最后一个月已经归还(months-1)份        remaining_principal = principal - principal_per_month * (month - 1)        # 当月利息 = 剩余本金 × 月利率        interest = remaining_principal * monthly_rate        # 当月月供 = 固定本金 + 当月利息        payment = principal_per_month + interest        # 把当月月供追加到列表中        monthly_payments.append(payment)        # 累加利息        total_interest += interest    # 总还款额 = 本金 + 总利息    total_payment = principal + total_interest    # 返回:首月月供、末月月供、总还款额、总利息    # 首月就是列表的第一个元素(索引0),末月就是最后一个元素(索引-1)    return monthly_payments[0], monthly_payments[-1], total_payment, total_interest

知识点

  1. 列表 []:用来保存每个月的月供,方便后续分析。

  2. range(1, months+1):生成从1到总月数的整数序列,循环变量month代表第几个月。

  3. principal_per_month * (month - 1):已经归还的本金总额。注意乘法优先级,不需要额外括号,但加上更清晰。

  4. 累加器 total_interest += interest:增强赋值操作符,等价于 total_interest = total_interest + interest。


对比一下:到底差多少?

写一个主程序,输入参数,输出两种方式的对比。

完整代码

"""房贷计算器(等额本息 vs 等额本金)知识点:函数定义、数字类型、幂运算、循环、列表、格式化输出"""# ---------- 第一部分:等额本息计算函数 ----------def equal_instalment(principal, annual_rate, years):    """    功能:计算等额本息方式下的月供、总还款额、总利息    参数:        principal : float, 贷款本金(元)        annual_rate : float, 年利率(如0.049表示4.9%)        years : int, 贷款年限    返回值:        monthly_payment : float, 每月固定还款额(元)        total_payment : float, 总还款额(本金+利息)        total_interest : float, 总利息    """    # 月利率 = 年利率 / 12    # 注意:除法结果自动变成浮点数,保留足够精度    monthly_rate = annual_rate / 12    # 总月数 = 年限 × 12    months = years * 12    # 计算 (1 + 月利率) ^ 总月数    # ** 是幂运算符,这里计算的是复利因子    factor = (1 + monthly_rate) ** months    # 等额本息月供公式:    # 月供 = 本金 × [月利率 × (1+月利率)^总月数] / [(1+月利率)^总月数 - 1]    # 注意运算优先级:先乘方,再乘除,最后加减    monthly_payment = principal * monthly_rate * factor / (factor - 1)    # 总还款额 = 月供 × 总月数    total_payment = monthly_payment * months    # 总利息 = 总还款额 - 本金    total_interest = total_payment - principal    # 返回三个值(实际上返回一个元组,Python自动打包)    return monthly_payment, total_payment, total_interest# ---------- 第二部分:等额本金计算函数 ----------def equal_principal(principal, annual_rate, years):    """    功能:计算等额本金方式下的首月月供、末月月供、总还款额、总利息    参数同上    返回值:        first_month : float, 第一个月月供        last_month : float, 最后一个月月供        total_payment : float, 总还款额        total_interest : float, 总利息    """    monthly_rate = annual_rate / 12    months = years * 12    # 每月固定偿还的本金 = 总本金 / 总月数    principal_per_month = principal / months    # 创建一个空列表,用来存储每个月的月供(方便以后分析)    monthly_payments = []    # 累计总利息,初始为0    total_interest = 0    # 循环变量 month 从 1 到 months(包含)    # range(1, months+1) 生成 [1, 2, 3, ..., months]    for month in range(1, months + 1):        # 当前月剩余本金 = 总本金 - 已经归还的本金        # 已经归还的本金 = 每月固定本金 × (month-1)        # 注意:month从1开始,第一个月已经归还0元,最后一个月已经归还(months-1)份        remaining_principal = principal - principal_per_month * (month - 1)        # 当月利息 = 剩余本金 × 月利率        interest = remaining_principal * monthly_rate        # 当月月供 = 固定本金 + 当月利息        payment = principal_per_month + interest        # 把当月月供追加到列表中        monthly_payments.append(payment)        # 累加利息        total_interest += interest    # 总还款额 = 本金 + 总利息    total_payment = principal + total_interest    # 返回:首月月供、末月月供、总还款额、总利息    # 首月就是列表的第一个元素(索引0),末月就是最后一个元素(索引-1)    return monthly_payments[0], monthly_payments[-1], total_payment, total_interest# ---------- 第三部分:主程序(用户交互) ----------def loan_comparison():    """    主函数:获取用户输入,调用两个计算函数,打印对比结果    """    # 打印一个分隔线,宽度50,内容居中    print("="*50)    print("        房贷计算器(等额本息 vs 等额本金)")    print("="*50)    # 获取输入    # float() 将字符串转为浮点数    # input() 返回用户输入的字符串    # 注意:输入“100”时,100 * 10000 = 1000000(元)    principal = float(input("请输入贷款本金(万元):")) * 10000    annual_rate = float(input("请输入年利率(如4.9% 输入 0.049):"))    years = int(input("请输入贷款年限:"))   # int()转整数    # 调用等额本息函数,返回三个值,按顺序赋值    mp_inst, total_inst, interest_inst = equal_instalment(principal, annual_rate, years)    # 调用等额本金函数,返回四个值    first_month, last_month, total_princ, interest_princ = equal_principal(principal, annual_rate, years)    # 打印等额本息结果    print("\n--- 等额本息 ---")    # round(x, 2) 保留两位小数    print(f"每月固定月供:{round(mp_inst, 2)} 元")    print(f"总还款额:{round(total_inst, 2)} 元")    print(f"总利息:{round(interest_inst, 2)} 元")    # 打印等额本金结果    print("\n--- 等额本金 ---")    print(f"首月月供:{round(first_month, 2)} 元")    print(f"末月月供:{round(last_month, 2)} 元")    print(f"总还款额:{round(total_princ, 2)} 元")    print(f"总利息:{round(interest_princ, 2)} 元")    # 计算两种方式总利息的差值    diff_interest = interest_inst - interest_princ    print(f"\n【结论】等额本金比等额本息节省利息:{round(diff_interest, 2)} 元")    # 判断前期压力:如果等额本金首月月供超过等额本息月供的1.5倍,则提醒    if first_month > mp_inst * 1.5:        print("注意:等额本金前期还款压力较大,请根据自身收入合理安排。")    else:        print("两种方式前期压力相近,等额本金更省利息。")# ---------- 第四部分:入口 ----------# 这个判断的意思是:如果当前文件是直接运行(而不是被其他文件导入),则执行下面的代码# 这是一种常见的Python写法,可以避免在导入模块时自动执行if __name__ == "__main__":    loan_comparison()

运行示例

请输入贷款本金(万元):100请输入年利率(如4.9% 输入 0.049):0.049请输入贷款年限:30--- 等额本息 ---每月固定月供:5307.27 元总还款额:1910616.19 元总利息:910616.19 元--- 等额本金 ---首月月供:6861.11 元末月月供:2789.47 元总还款额:1737041.67 元总利息:737041.67 元【结论】等额本金比等额本息节省利息:173574.52 元注意:等额本金前期还款压力较大,请根据自身收入合理安排。

代码中藏着的所有知识点

除了数字类型和运算,这次还学到了不少新东西。

1. 浮点数处理——避开 0.1+0.2 的坑

计算利息时,principal * monthly_rate 等运算会产生不确定尾数。这里我们用 round(..., 2) 格式化输出,不直接比较浮点数,所以安全。

2. 幂运算 ** 的优先级

(1+monthly_rate) ** months 中,指数运算优先级高于乘法,但括号保证了先加后乘方。

3. 列表与循环

monthly_payments = [] 创建一个空列表,append() 添加元素。循环变量 month 从1开始,符合日常习惯。

4. 字符串格式化——f-string 的妙用

f"首月月供:{round(first_month, 2)} 元" 直接在花括号里写表达式,非常方便。

5. 条件判断 if

比较首月月供与本息月供的1.5倍,给出建议。这是程序智能化的体现。

6. 模块化设计

把两个算法分别写成函数,主程序只负责输入输出。以后想复用,直接 import 这个模块即可。


我的一点小感悟

35岁学AI,不是为了当程序员,而是为了让自己在面对生活中的选择时,多一个理性思考的工具。

代码和数据不会骗人,它们只会给你客观的答案。


📌 今日学习笔记:

学到了什么:

  • 等额本息公式及Python实现(幂运算、浮点数)

  • 等额本金公式及列表记录月供

  • for 循环与 range() 的灵活使用

  • 累加求和 total_interest += interest

  • f-string 格式化输出(保留两位小数 :.2f 与 round())

  • 函数封装:def 定义,return 多值

  • if __name__ == "__main__" 的作用(直接运行才执行,被导入时不执行)

踩坑记录:

  • 忘记将月利率计算公式中的年利率除以12,直接用了年利率,算出来的月供高得离谱。

  • 等额本金中,剩余本金计算时 month-1 忘记减1,导致第一期利息算少了。

  • float( input() ) 输入中文会报错,暂时未做异常处理(以后学 try...except 再优化)。

用时: 1小时


📢 我是老李,35岁规划师,从零开始学AI。

每天1小时,记录真实学习路。不求成为大神,只为多一条出路。

如果你也在传统行业或者对未来感到焦虑,如果你也想学点新东西但一直没有开始

点击关注,我们一起进步;

也欢迎点赞 ❤️ 分享 ➕ 推荐,让更多同行者看到!

👇👇👇

最新文章

随机文章