使用while循环计算金额翻倍时长的代码错误排查与浮点数疑问
问题分析与修复方案
首先,你的代码出现inf和超大计数的核心原因是循环条件完全写错了——你用while x < 2*x:作为循环判断,这在x是正数的情况下永远成立(毕竟两倍的本金肯定比本金本身大),导致循环无限执行:
- 每次循环x都会乘以(1+y),直到它超出浮点数的最大表示范围,变成
inf(无穷大); - 当x变成
inf后,inf < 2*inf会被判定为False(因为无穷大的两倍还是无穷大),循环才会终止,这时候count已经累加到了一个离谱的数值。
修复后的代码
你需要先把初始本金存下来,用它来判断当前本金是否已经翻倍。另外,建议避免用eval处理输入(有安全风险),直接用float转换更稳妥:
def main(): initial_principal = float(input("Initial Principal: ")) interest_rate = float(input("Interest rate: ")) current_amount = initial_principal years = 0 while current_amount < 2 * initial_principal: current_amount *= (1 + interest_rate) years += 1 print(f"Final amount: {current_amount:.2f}") print(f"Years to double: {years}") main()
关于小本金小利率的浮点数问题
你的原代码不管本金和利率多大,都会因为循环条件错误无限运行,直到x变成inf。而修复后的代码,即使是本金=1、利率=0.05的情况,也能正常运行:
浮点数的精度误差确实存在,但对于这个场景来说影响极小——比如当current_amount非常接近两倍初始本金时,可能会多循环一次,但计算出的年份是符合实际复利逻辑的,完全可以满足练习的需求。
内容的提问来源于stack exchange,提问作者mathshungry
相关产品推荐
相关产品推荐

