Python中如何存储高精度大浮点数并进行运算?
如何在Python中高精度存储并运算大浮点数?
已在Stack Overflow调研确认,此问题并非以下问题的重复:
- How to get largest possible precision? (Python - Decimal)
- Arithmetic precision problems with large numbers
- How to store a big floating point number in python variable?
假设需要处理这样的大浮点数:11400361308443875328.123123123123,尝试过float和decimal.Decimal后,运算结果精度不符合预期:
from decimal import Decimal x = Decimal('11400361308443875328.123123123123123') + Decimal('11400361308443875328.123123123123123') print("{:12f}".format(x)) # 22800722616887750656.24624625 y = float(11400361308443875328.123123123123) + float(11400361308443875328.123123123123) print("{:12f}".format(y)) # 22800722616887750656.000000 z = Decimal('0.123123123123123') + Decimal('0.123123123123123') print("{:12f}".format(z)) # 0.246246246246246
需求是达到z这样的精度来存储并运算这类大浮点数,且编程竞赛场景下允许误差在±10^-6范围内。
核心解决思路:调整Decimal的精度设置
默认Decimal的上下文精度不足以完整保留大整数部分+多位小数的精度,需手动设置足够高的精度值,同时确保用字符串初始化Decimal避免精度损失。
具体实现代码
from decimal import Decimal, getcontext # 设置足够覆盖整数+小数总位数的精度,这里设为30位 getcontext().prec = 30 x = Decimal('11400361308443875328.123123123123123') + Decimal('11400361308443875328.123123123123123') print(x) # 输出:22800722616887750656.246246246246246 print("{:12f}".format(x)) # 输出:22800722616887750656.246246246246
原理说明
float仅支持约15-17位有效数字,目标数的整数部分已有20位,因此float会直接丢失小数部分信息,导致y的结果为整数。- 默认
Decimal的prec为28位,而两个目标数相加后总有效数字超过28位,调整prec到足够大即可完整保留精度。
编程竞赛优化技巧:整数运算替代浮点数
如果仅需保证最终结果误差在±10^-6范围内,可将所有数值转换为整数运算,彻底避免浮点数精度问题:
from decimal import Decimal # 将原数乘以10^6转为整数(用Decimal转换避免精度损失) num_int = int(Decimal('11400361308443875328.123123123123') * 10**6) sum_int = num_int * 2 # 运算后再除以10^6得到结果 result = sum_int / 10**6 print(result) # 输出:22800722616887750656.246246246246
内容的提问来源于stack exchange,提问作者grandia
相关产品推荐
相关产品推荐

