首页 > 解决方案 > 长的奇怪的 Python 3 mod 行为

问题描述

考虑这个代码片段。

>>> n, m = 10011617, 100000000000006340
>>> s = lambda n: n * (n + 1) / 2
>>> s(n)
50116242483153.0
>>> s(n) == int(s(n))
True
>>> m % s(n)
18096246116101.0
>>> m % int(s(n))
18096246116105

如您所见,s(n)是一个整数(数学上),然而m % s(n) != m % int(s(n)).

这可能与引擎盖下的长期存在有关吗s(n)m即使是这样,为什么s(n) == int(s(n))当我取模时结果不相等?

PS我在repl.it中运行了这个

标签: python-3.xmathintegerlong-integer

解决方案


在这种特殊情况下,问题m不仅仅是由于s(n). 计算时m % s(n),因为s(n)是浮点数,m所以被强制为浮点数。但是——float(m)失去精度。看到这一点的最清楚的方法是

m == 100000000000006340

int(float(m)) == 100000000000006336

请注意100000000000006336 % 50116242483153 == 18096246116101,它显示了神秘值的来源。


推荐阅读