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

Python while循环计算余额出现inf结果的问题排查与修复

问题修复与替代实现

问题根源分析

代码出现inf(无穷大)的核心问题是利率常量设置错误,同时初始余额计算逻辑也存在偏差:

  • BRISSIE_INT_RATE = 104000完全不符合4%年利率的定义,正确年增长因子应为1.04(本金+4%利息)。原数值会让余额每次循环乘以104000,瞬间突破浮点数上限变成inf。
  • 初始余额直接用存款乘利率,相当于提前计算了第一年利息,但年份初始值为0,逻辑错位。
  • 缺少import sys语句,调用sys.set_int_max_str_digits会触发NameError。

修复后的代码

import sys

# 定义常量
BALKCOM_INI_DEPOSIT = 1
BALKCOM_INT_RATE = 1.05  # 5%年利率的增长因子
BRISSIE_INI_DEPOSIT = 100000
BRISSIE_INT_RATE = 1.04  # 修正为4%年利率的增长因子

# 初始化余额与年份
balkcom_balance = BALKCOM_INI_DEPOSIT
brissie_balance = BRISSIE_INI_DEPOSIT
year = 0

sys.set_int_max_str_digits(100000)

# 循环直到Balkcom余额超过Brissie
while balkcom_balance < brissie_balance:
    balkcom_balance *= BALKCOM_INT_RATE
    brissie_balance *= BRISSIE_INT_RATE
    year += 1

print(f"Year: {year}  Balkcom balance: {balkcom_balance:.2f}  Brissie balance: {brissie_balance:.2f}")

另一种基于while循环的实现(规避浮点数精度误差)

如果担心长期迭代的浮点数精度问题,可以用整数运算(将金额转换为分,避免小数):

import sys

# 常量转换为分(避免浮点数运算)
BALKCOM_INI_DEPOSIT = 100  # 1元 = 100分
BALKCOM_INT_RATE_NUM = 105  # 5%利率:每100分增长5分,等价于乘以105/100
BALKCOM_INT_RATE_DEN = 100
BRISSIE_INI_DEPOSIT = 10000000  # 100000元 = 10000000分
BRISSIE_INT_RATE_NUM = 104
BRISSIE_INT_RATE_DEN = 100

balkcom_balance = BALKCOM_INI_DEPOSIT
brissie_balance = BRISSIE_INI_DEPOSIT
year = 0

sys.set_int_max_str_digits(100000)

# 用交叉相乘避免除法,保持整数运算
while balkcom_balance * BRISSIE_INT_RATE_DEN < brissie_balance * BALKCOM_INT_RATE_DEN:
    balkcom_balance = balkcom_balance * BALKCOM_INT_RATE_NUM // BALKCOM_INT_RATE_DEN
    brissie_balance = brissie_balance * BRISSIE_INT_RATE_NUM // BRISSIE_INT_RATE_DEN
    year += 1

# 转换回元并保留两位小数
print(f"Year: {year}  Balkcom balance: {balkcom_balance/100:.2f}  Brissie balance: {brissie_balance/100:.2f}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:35:16