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

Python计算N位圆周率仅得15位小数,禁用decimal库如何解决?

为什么你的Python代码只能返回15位圆周率小数,以及如何获取更多位数

一、为什么限制在15位?

你代码里用的是Python默认的浮点数(float类型),它基于IEEE 754双精度标准,天生只能提供约15-17位有效数字。不管循环多少次累加,浮点数的精度上限就在这,多余的位数会被截断或变成无意义数值,所以最终输出最多只能看到15位有效小数。

二、不用decimal库怎么获取更多位数?

要突破浮点数精度限制,得用整数运算模拟高精度小数计算——整数可以表示任意大的数值,不会有精度损失。下面基于你用的BBP公式(贝利-波尔温-普劳夫公式),修改为整数运算版本:

修改后的代码

def calc_pi(n):
    # 多算10位抵消截断误差,保证最终n位小数的准确性
    precision = n + 10
    # 将圆周率放大10^precision倍,用整数存储所有计算结果
    pi = 0
    for k in range(precision):
        # 计算公式中各项的整数形式
        term1 = 4 * (10 ** precision) // (8 * k + 1)
        term2 = 2 * (10 ** precision) // (8 * k + 4)
        term3 = (10 ** precision) // (8 * k + 5)
        term4 = (10 ** precision) // (8 * k + 6)
        # 处理16^(-k):用整数除法等价实现除法运算
        divisor = 16 ** k
        term = (term1 - term2 - term3 - term4) // divisor
        pi += term
    # 将整数结果拆分为整数部分和小数部分
    pi_str = str(pi)
    return f"{pi_str[0]}.{pi_str[1:n+1]}"

# 示例:获取50位小数
print(calc_pi(50))

代码说明

  • 核心逻辑是把所有运算放在整数域:将圆周率放大10^precision倍,让小数部分转化为整数的一部分,彻底规避浮点数精度损失。
  • 多算10位是为了抵消整数除法的截断误差,最后截取目标n位小数时,结果会更准确。
  • 公式中的16^(-k)通过整数除法// 16^k实现,等价于原公式的缩放效果。

输出示例

运行calc_pi(50)会得到:

3.14159265358979323846264338327950288419716939937510

补充说明

如果需要更高精度,只需调整precision的值(比如要100位小数,就设precision = 100 + 10),整数运算可以轻松处理大数,不会有浮点数的精度瓶颈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:16:34