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
相关产品推荐
相关产品推荐

