Python中x%(1e9+7)与x%(10**9+7)结果不同的原因是什么?
1e9+7 与 10**9+7 取模结果差异的原因
核心本质
两者的类型完全不同:
10 ** 9 + 7是Python原生整数,值精确等于1000000007,参与所有整数运算都不会丢失精度1e9 +7是64位双精度浮点数,虽然表面数值同样是1000000007,但浮点数的存储结构天生存在精度限制
具体出错原因
64位双精度浮点数的有效二进制位数只有53位,只能精确表示绝对值不超过 2^53(约等于9e15)的整数。你这道题的测试用例maxMove达到了50,迭代过程中累计的路径总数ans会远远超过9e15这个阈值,此时ans被隐式转换为浮点数参与运算时,末尾的二进制位会被截断,变成不精确的近似值,基于近似值做取模运算自然会得到错误结果。
就算迭代过程中ans暂时没有超过精度阈值,整数和浮点数取模返回的结果也是浮点数类型,后续累加过程中也会逐步累积精度误差,迭代次数足够多时误差同样会放大到导致结果错误的程度。
避坑建议
所有算法题涉及取模运算时,统一使用整数字面量 10 ** 9 +7 声明模数,绝对不要使用浮点数写法的 1e9+7,避免这类极难排查的精度问题。
内容的提问来源于stack exchange,提问作者Deep
相关产品推荐
相关产品推荐

