Python中round()函数计算不符预期及LeetCode提交失败问题排查
问题排查与优化方案
问题分析
你的代码存在两个核心问题:
- 取整逻辑不符合需求:
round()是四舍五入取整,但你需要的是向零截断取整(舍去小数部分,保留与原数符号一致的整数)。虽然部分用例看似正常,但本质逻辑不对,且浮点数运算可能带来精度误差。 - 32位整数溢出未处理:LeetCode的整数除法题目通常限定为32位有符号整数范围(
[-2^31, 2^31-1]),当被除数为-2147483648、除数为-1时,结果为2147483648,超出了32位有符号整数的最大值2147483647,必须单独处理这种溢出情况。
另外,原代码中dividend/divisor在Python3中返回浮点数,导致返回值是3.0这类浮点数,不符合题目对整数类型的要求。
优化方案
核心思路
- 用向零取整替代四舍五入:通过整数运算避免浮点数精度问题,正数间的整数除法
//是向下取整,配合符号判断可实现向零取整。 - 提前拦截溢出场景:当被除数是
-2^31且除数是-1时,直接返回2^31-1。 - 符号分离处理:先计算结果的符号,再对绝对值进行除法运算,简化逻辑。
优化后的代码
class Solution(object): def divide_integer(self, dividend, divisor): # 32位有符号整数范围定义 INT_MIN = -2147483648 INT_MAX = 2147483647 # 处理唯一的溢出情况 if dividend == INT_MIN and divisor == -1: return INT_MAX # 计算结果的符号:异或运算判断两数符号是否不同 sign = -1 if (dividend < 0) ^ (divisor < 0) else 1 # 转为绝对值运算,避免负数除法的复杂逻辑 abs_dividend = abs(dividend) abs_divisor = abs(divisor) # 正数间的整数除法//实现向下取整,符合向零取整需求 res = abs_dividend // abs_divisor # 恢复符号并确保结果在合法范围内 res = res * sign return max(min(res, INT_MAX), INT_MIN) if __name__ == "__main__": p = 7 t = -3 dividend = 10 divisor = 3 print(Solution().divide_integer(p, t)) # 输出-2 print(Solution().divide_integer(dividend, divisor)) # 输出3 print(Solution().divide_integer(-2147483648, -1)) # 输出2147483647
代码说明
- 溢出拦截:单独处理
dividend=-2147483648且divisor=-1的场景,直接返回INT_MAX,避免结果超出范围。 - 符号计算:用异或运算快速判断被除数和除数的符号是否不同,确定最终结果的符号。
- 绝对值运算:将两个数转为正数后用
//做整数除法,正数间的//是向下取整,正好匹配向零取整的需求,最后再恢复符号。 - 范围兜底:用
max(min(res, INT_MAX), INT_MIN)确保结果始终落在32位有符号整数范围内,避免其他极端情况的溢出。
原代码失败原因
round()逻辑不符:对于-2.333这类数,round()返回-2看似正确,但如果是-3.6,round()会返回-4,不符合向零取整的要求。- 浮点数精度问题:处理极大数
-2147483648时,转为浮点数可能丢失精度,导致计算结果偏差。 - 溢出未处理:
-2147483648 / -1得到2147483648.0,超出32位有符号整数上限,被LeetCode判定为错误。
内容的提问来源于stack exchange,提问作者user20502753
相关产品推荐
相关产品推荐

