为何我的Python For循环计算ERA时首个结果小数位多于2位?
解决Python浮点数精度导致的ERA计算尾差问题
问题根源
你碰到的2.2800000000000002是典型的浮点数二进制存储精度问题:十进制的2.28没法用二进制浮点数精确表示,计算后会产生微小的精度误差,输出时就显出来了。
实用解决方法
方法1:用round()函数直接保留两位小数
最简单的处理方式,对计算结果做四舍五入,同时优化原代码的循环逻辑(不用手动维护i变量):
InningsPitched = [228,205,196,194,181,164] EarnedRuns = [58,74,49,67,59,79] Pitcher = ["Sandy Alcantara","Aaron Nola","Alek Manoah","Yu Darvish","Joe Musgrove","Corey Kluber"] for i, ip in enumerate(InningsPitched): era = 9 * EarnedRuns[i] / ip print(Pitcher[i], round(era, 2))
方法2:字符串格式化控制输出格式
如果只是想要输出时显示两位小数,不用修改实际数值,可以用f-string格式化:
InningsPitched = [228,205,196,194,181,164] EarnedRuns = [58,74,49,67,59,79] Pitcher = ["Sandy Alcantara","Aaron Nola","Alek Manoah","Yu Darvish","Joe Musgrove","Corey Kluber"] for i, ip in enumerate(InningsPitched): era = 9 * EarnedRuns[i] / ip print(f"{Pitcher[i]} {era:.2f}")
这种方式会自动补零(比如Yu Darvish的结果会显示3.10),如果想要保留一位小数的话可以改成:.1f。
方法3:用decimal模块做精确十进制计算
如果需要绝对精确的数值计算(比如统计报表的精确值),可以用Python标准库的decimal模块:
from decimal import Decimal, getcontext # 设置计算精度,足够覆盖ERA的两位小数需求 getcontext().prec = 4 InningsPitched = [228,205,196,194,181,164] EarnedRuns = [58,74,49,67,59,79] Pitcher = ["Sandy Alcantara","Aaron Nola","Alek Manoah","Yu Darvish","Joe Musgrove","Corey Kluber"] for i, ip in enumerate(InningsPitched): era = (Decimal(9) * Decimal(EarnedRuns[i])) / Decimal(ip) print(Pitcher[i], round(era, 2))
最终输出效果
三种方法都能得到你预期的结果:
Sandy Alcantara 2.28 Aaron Nola 3.24 Alek Manoah 2.25 Yu Darvish 3.1 # 用round的结果,格式化会显示3.10 Joe Musgrove 2.93 Corey Kluber 4.33
内容的提问来源于stack exchange,提问作者Jameswoody0802
相关产品推荐
相关产品推荐

