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

Python计算以3为底的对数精度问题(LeetCode3的幂判定)

解决3的幂问题中的对数精度误差

你遇到的精度问题是因为浮点数的二进制表示局限性,math.log(k, 3) 本质是通过自然对数转换计算的(math.log(k)/math.log(3)),而log(3)是无理数,导致计算结果出现微小的精度偏差,比如243的对数本该是5,却输出了4.999999999999999。

以下是基于对数的可靠解决方案:

方案一:对数计算+反向验证(推荐)

class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        import math
        if n <= 0:
            return False
        # 计算以3为底的对数
        log_val = math.log(n, 3)
        # 加极小值修正精度偏差后取整,得到理论上的整数指数
        exp = int(log_val + 1e-10)
        # 反向验证3的该次方是否等于原数,彻底规避精度误判
        return 3 ** exp == n

原理说明

  • 加1e-10是为了修正那些因精度问题略小于真实整数的对数结果(比如4.999999999999999),取整后得到正确的指数。
  • 最后通过3 ** exp == n反向验证,只有当n确实是3的幂时,这个等式才成立,完全避免了浮点数精度带来的误判。

方案二:用math.isclose判断对数是否接近整数

如果你能接受使用round(),配合严格的容差也能安全判断:

class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        import math
        if n <= 0:
            return False
        log_val = math.log(n) / math.log(3)
        # 设置极小的容差,确保只有真正接近整数的对数才会被判定为相等
        return math.isclose(log_val, round(log_val), rel_tol=1e-10, abs_tol=1e-10)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:05:23