1

我希望有人可以帮助我解释这个关于大除数的奇怪结果,或者建议我使用一些关键字,这样我才能得到更好的搜索。

>>> m = 1e9+9
>>> n = 1000000009
>>> m == n
True
>>> 2549015908609065 % m
885667930.0
>>> 2549015908609065 % n
885667930
>>> 2549015908609065L % n
885667930L
>>> 2549015908609065L % m
885667930.0

>>> 254901590860906524041412370460835L % m
98506080.0
>>> 254901590860906524041412370460835L % n
327998297L

>>> 254901590860906524041412370460835L % int(m)
327998297L
4

2 回答 2

2

您看到奇怪结果的原因是因为您正在对浮点数执行模运算,这些浮点数具有不精确的表示。十进制模块的文档很好地强调了这一点。

要对非常大的数字执行精确运算,可以使用如下的小数类:

from decimal import *
print Decimal(2549015908609065) % Decimal(1e9) # Gives the answer you expect
于 2013-09-10T19:03:43.373 回答
1

m = 1e9+9将数字存储为浮点数;但是n = 1000000009将数字存储为整数。

当您将整数除以浮点数时,python 会隐式输出浮点数作为结果;但是,当您将一个整数除以另一个整数时,您会得到整数商。Float 在较大数字上的精度会降低。

如果你注意到,

>>> 254901590860906524041412370460835L % m
98506080.0
#outputted a float with different precision

>>> 254901590860906524041412370460835L % n
327998297L
#outputted a long int

查看http://www.tutorialspoint.com/python/python_numbers.htm以获取有关 python 数字的基本教程

于 2013-09-10T19:06:43.903 回答