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

如何在纯Python中对超大整数执行四舍五入除法?

超大整数除法四舍五入到最近整数的纯Python实现

处理超大整数时,round(x/y)会因浮点数精度丢失返回错误结果,x//y仅支持向下取整,Decimal库在PyPy中性能较差。以下是基于纯整数运算的高效实现,能正确处理所有正负号场景:

实现代码

def divide(x, y):
    if y == 0:
        raise ValueError("除数不能为0")
    abs_y = abs(y)
    quotient = x // y
    remainder = x % y
    
    # 判断是否需要向最近整数调整商
    if abs(remainder) * 2 > abs_y:
        quotient += 1
    return quotient

测试验证

用你提供的测试用例验证:

x1 = 10**100 - 1
x2 = 10**100 + 1
y = 2 * 10**100

assert divide(x1, y) == 0
assert divide(x2, y) == 1

assert divide(x1, -y) == 0
assert divide(x2, -y) == -1

assert divide(-x1, y) == 0
assert divide(-x2, y) == -1

assert divide(-x1, -y) == 0
assert divide(-x2, -y) == 1

所有断言均可通过,完全符合预期。

逻辑说明

  1. 利用Python内置的整数除法//得到向下取整的商,取模%得到余数(余数符号与除数一致)
  2. 通过比较余数绝对值的2倍与除数绝对值的大小,判断是否需要将商向实际值方向调整:
    • 若余数绝对值的2倍大于除数绝对值,说明实际值更接近商+1,因此调整商
  3. 全程仅使用整数运算,无浮点数精度问题,在PyPy中能高效运行

扩展:处理0.5的取舍场景

如果需要处理刚好等于0.5的情况(如5/2=2.5),可根据需求修改判断逻辑:

  • 普通四舍五入(0.5进1):将判断条件改为abs(remainder)*2 >= abs_y
  • 银行家舍入(0.5取偶数):
    if abs(remainder)*2 > abs_y or (abs(remainder)*2 == abs_y and quotient % 2 != 0):
        quotient += 1
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:45:34