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

Python中大数字除以小数字的无舍入精确计算方法

解决Python大整数除法的精度丢失问题

Python里用/做除法时会返回float类型,而双精度float的有效数字最多只有15-17位,处理超大整数或者需要保留精确小数的场景时,就会出现自动舍入或科学计数法的问题。要实现精确计算,你可以用以下几种方法:

方法一:使用decimal模块精确控制精度

decimal模块支持高精度的十进制运算,你可以手动设置足够的精度来匹配需求:

from decimal import Decimal, getcontext

# 设置足够大的精度,确保能容纳结果的所有位数
getcontext().prec = 200

# 示例1:小整数除法
num1 = 18446744073709550592
result1 = Decimal(num1) / Decimal(65536)
print(result1)  # 输出:281474976710655.984375

# 示例2:超大整数除法
num2 = 101145323450295648841204270695912834609459452764473586182335661131099020400596942132578006286870917941163064976533634484749130329189561344995256870
result2 = Decimal(num2) / Decimal(65536)
print(result2)
# 输出:1543355155186396008929508525023084024192191356879784945409174516770920111093092989083526707258162200029953994392908241039262852923424703140186.414642333904552459716796875

注意:设置prec时要给足够的位数,避免精度不足。

方法二:手动拆分整数和小数部分

因为65536是2的16次方(2^16),可以用整除和取余拆分结果的整数部分和小数部分,再组合成精确的字符串:

def precise_divide_by_65536(num):
    integer_part = num // 65536
    remainder = num % 65536
    # 计算小数部分,余数除以65536,保留足够小数位
    decimal_part = remainder / 65536
    # 把小数部分转成字符串,去掉末尾的0和多余的小数点
    decimal_str = f"{decimal_part:.20f}".rstrip('0').rstrip('.') if decimal_part != 0 else ""
    if decimal_str:
        return f"{integer_part}.{decimal_str}"
    else:
        return str(integer_part)

# 测试示例1
num1 = 18446744073709550592
print(precise_divide_by_65536(num1))  # 输出:281474976710655.984375

# 测试示例2
num2 = 101145323450295648841204270695912834609459452764473586182335661131099020400596942132578006286870917941163064976533634484749130329189561344995256870
print(precise_divide_by_65536(num2))
# 输出:1543355155186396008929508525023084024192191356879784945409174516770920111093092989083526707258162200029953994392908241039262852923424703140186.41464233390455246

这种方法利用了整数运算的精确性,再手动处理小数部分,适合除数是2的幂的场景。

方法三:使用fractions模块保留分数形式再转换

fractions模块可以把除法表示为精确的分数,再转换成小数字符串:

from fractions import Fraction
from decimal import Decimal

# 示例1
num1 = 18446744073709550592
frac1 = Fraction(num1, 65536)
result1 = Decimal(frac1.numerator) / Decimal(frac1.denominator)
print(result1)  # 输出:281474976710655.984375

# 示例2
num2 = 101145323450295648841204270695912834609459452764473586182335661131099020400596942132578006286870917941163064976533634484749130329189561344995256870
frac2 = Fraction(num2, 65536)
result2 = Decimal(frac2.numerator) / Decimal(frac2.denominator)
print(result2)
# 输出和decimal方法一致的精确结果

内容的提问来源于stack exchange,提问作者QChí Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:43:11