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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:45:03