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

Matplotlib饼图浮点数文本显示异常:整数转换未正确四舍五入问题

问题原因分析

你遇到的问题核心在于Python的int()函数行为——它不是四舍五入,而是直接截断小数部分,只保留整数部分。比如:

  • int(22.9) 的结果是22
  • int(23.999) 的结果还是23
    不管小数部分多么接近下一个整数,int()都会直接砍掉小数,只取前面的整数。

为什么会出现22.9这类数值?因为浮点数计算存在精度误差:实际总用户数是44(23+21),23/44的百分比≈52.2727%,用这个百分比乘以总用户数44时,理论上应该得到23,但由于浮点数的二进制存储精度限制,实际计算结果可能是22.999999999999996这种接近23但略小一点的数,这时候用int()转换就会得到22,而非你预期的23。


解决方案

有两种靠谱的解决思路,你可以按需选择:

1. 用四舍五入代替截断

把int()换成round()函数,它会按照四舍五入规则处理小数:

def func(pct, allvals):
    absolute = round(pct/100.*np.sum(allvals))
    return "{:.0f}%\n({:d} users)".format(pct, absolute)

这样即使计算出的数值是22.999999999999996,round()也会把它转为23,完美匹配你的实际用户数。

2. 直接使用已知的用户数(更精准)

既然你已经知道每个集群的用户数(就是data列表里的数值),完全不需要通过百分比反推,直接在标签里引用真实数值,彻底避免浮点数误差:

# 提前准备好每个切片的百分比和用户数标签
total_users = np.sum(data)
labels = [f"{round(d/total_users*100):.0f}%\n({int(d)} users)" for d in data]

# 绘制饼图时直接使用这些标签
wedges, texts, autotexts = ax.pie(data, labels=labels, textprops=dict(color="w"))

这种方法更直接,也不会有任何计算误差,因为我们直接使用了原始的用户数数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:47:30