在科学计算、金融系统或密码学等领域,普通浮点数的精度往往无法满足需求。Python 提供了强大的高精度计算支持,本文将手把手教你如何使用 Python高精度计算 的核心工具——decimal 和 fractions 模块。
Python 默认使用 IEEE 754 双精度浮点数(float),它只能提供约15-17位十进制有效数字。例如:
>>> 0.1 + 0.20.30000000000000004 这显然不是我们期望的 0.3!这种微小误差在累积后可能导致严重问题。因此,在需要精确结果的场景中,我们必须使用 任意精度数值运算 工具。
decimal 模块是 Python 标准库的一部分,专为十进制浮点运算设计,非常适合金融和会计应用。
from decimal import Decimal# 使用字符串初始化避免 float 精度问题a = Decimal('0.1')b = Decimal('0.2')result = a + bprint(result) # 输出: 0.3 你可以通过 getcontext().prec 控制计算精度(有效数字位数):
from decimal import getcontext, Decimal# 设置全局精度为50位getcontext().prec = 50pi_approx = Decimal(22) / Decimal(7)print(pi_approx)# 输出: 3.1428571428571428571428571428571428571428571428571 如果你希望完全避免小数,而是以分数形式表示数值,fractions 模块是理想选择。它能自动约分并保持精确性。
from fractions import Fraction# 创建分数f1 = Fraction(1, 3) # 1/3f2 = Fraction('0.25') # 自动转为 1/4result = f1 + f2print(result) # 输出: 7/12print(float(result)) # 转为浮点: 0.5833333333333334 下面使用 decimal 模块结合数学公式计算高精度 π:
from decimal import Decimal, getcontext# 设置精度为110位(多算几位防止舍入误差)getcontext().prec = 110# 使用 Machin 公式: π/4 = 4*arctan(1/5) - arctan(1/239)def arctan(x): x_squared = x * x total = x term = x n = 1 while True: term *= -x_squared next_term = term / (2*n + 1) if abs(next_term) < Decimal('1e-105'): break total += next_term n += 1 return totalone = Decimal(1)pi = 4 * (4*arctan(one/5) - arctan(one/239))# 输出前100位print(str(pi)[:102]) # 包含 "3." 共102字符 通过本文,你已经掌握了 Python 中实现 Python高精度计算 的两种主要方式:
decimal 模块:适用于需要控制小数位数和舍入规则的场景(如金融)。fractions 模块:适用于需要保持分数形式、避免任何浮点转换的场景。记住:永远不要用 float 初始化 Decimal,而应使用字符串或整数,这样才能真正发挥 任意精度数值运算 的优势。
关键词回顾:Python高精度计算、decimal模块、fractions模块、任意精度数值运算
本文由主机测评网于2025-12-10发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125761.html