Python和"任意精度整数"

Jef*_*der 15 python arbitrary-precision

根据Python整数范围的答案,Python应该具有"任意精度整数" .但是这个结果显然不是任意精度:

$ python -c 'print("%d" % (999999999999999999999999/3))'
333333333333333327740928
Run Code Online (Sandbox Code Playgroud)

根据PEP 237,bignum任意大(不仅仅是C long型的大小).和维基百科说,Python的bignum是任意精度.

那么为什么上面一行代码的结果不正确呢?

jb.*_*jb. 27

实际上在python3中,每当你划分整数时,你就会得到浮点数.有一个//运算符执行整数除法:

 >>> 999999999999999999999999/3
 3.333333333333333e+23
 >>> 999999999999999999999999//3
 333333333333333333333333

 >>> type(999999999999999999999999/3)
 <class 'float'>
 >>> type(999999999999999999999999//3)
 <class 'int'>
Run Code Online (Sandbox Code Playgroud)

这确实提供了正确的任意精度输出:

 python -c 'print("%d" % (999999999999999999999999//3))' 
 333333333333333333333333
Run Code Online (Sandbox Code Playgroud)

如何编写兼容python 2.2+和3.3的代码

这实际上很简单,只需添加:

 >>> from __future__ import division 
Run Code Online (Sandbox Code Playgroud)

这将使2.2X代码中的3.X分区成为可能.

>>> from sys import version 
>>> version
'2.7.6 (default, Dec 30 2013, 14:37:40) \n[GCC 4.8.2]'
>>> from __future__ import division 
>>> type(999999999999999999999999//3)
<type 'long'>
>>> type(999999999999999999999999/3)
<type 'float'>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`//`运算符可用*自[Python2.2](http://www.python.org/dev/peps/pep-0238/)*(我相信2001年左右发布).所以它不是*python3功能. (3认同)