如何修复Python整数回文判断代码中出现的数值精度错误问题
问题诱因
- 代码中使用的
math.log()、math.pow()均为浮点数运算函数,Python 双精度浮点数仅支持约15~17位有效数字,当输入整数长度超过这个范围时,转换为浮点数计算会丢失精度。 - 测试用例
1212121212121212121共有19位有效数字,超出了浮点数的精度上限,计算math.log得到的结果本身存在误差,经过round()后得到的位数结果错误,进一步导致最高位取值错误,最终判断失败。 - 此外
math.pow()返回值为浮点数,大指数场景下和整数运算也会出现精度偏差,进一步放大了错误。
修复方案
核心思路是避免使用浮点运算,全部替换为整数运算,以下提供两种可选实现:
方案1:沿用原逻辑,替换浮点运算
将位数计算、幂次计算全部改为整数运算,完全规避浮点误差:
def intPalindrome(num): if num <= 0: return num == 0 cur_num = num while cur_num > 0: lsd = cur_num % 10 # 整数循环计算位数,无精度损失 num_digits = 0 temp = cur_num while temp > 0: temp = temp // 10 num_digits += 1 # 整数幂运算,返回结果为整数 msd = cur_num // (10 ** (num_digits - 1)) if lsd != msd: return False else: cur_num = cur_num - msd * (10 ** (num_digits - 1)) cur_num //= 10 return True
方案2:更高效的后半段反转法
无需计算数字位数,仅反转整数的后半段进行比对,时间复杂度更低、性能更好:
def intPalindrome(num): # 负数、末尾为0且非0的数必然不是回文 if num < 0 or (num % 10 == 0 and num != 0): return False reversed_half = 0 while num > reversed_half: reversed_half = reversed_half * 10 + num % 10 num = num // 10 # 偶数位直接判等,奇数位去掉反转后的最后一位再判等 return num == reversed_half or num == reversed_half // 10
两种方案测试你提供的用例,均会返回正确结果True。
内容的提问来源于stack exchange,提问作者talos1904
相关产品推荐
相关产品推荐

