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

为何我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:07:06