多头的奇怪 Python 3 mod 行为

Strange Python 3 mod behavior for longs

考虑这个代码片段。

>>> 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)) 但是当我取模时结果不相等?

P.S。我运行这个在repl.it

在这种特殊情况下,问题更多是由于 m 而不是 s(n)。在计算 m % s(n) 时,由于 s(n) 是一个浮点数,所以 m 被强制转换为一个浮点数。但是 -- float(m) 失去了精度。最清楚的方法是

m == 100000000000006340

但是

int(float(m)) == 100000000000006336

注意100000000000006336 % 50116242483153 == 18096246116101,表示神秘值的来源