如何在纯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
所有断言均可通过,完全符合预期。
逻辑说明
- 利用Python内置的整数除法
//得到向下取整的商,取模%得到余数(余数符号与除数一致) - 通过比较余数绝对值的2倍与除数绝对值的大小,判断是否需要将商向实际值方向调整:
- 若余数绝对值的2倍大于除数绝对值,说明实际值更接近商+1,因此调整商
- 全程仅使用整数运算,无浮点数精度问题,在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
相关产品推荐
相关产品推荐

