Python和“任意精度整数”

时间:2014-01-09 21:04:50

标签: python arbitrary-precision

根据Python integer ranges中的答案,Python应该具有“任意精度整数”。但是这个结果显然任意精度:

$ python -c 'print("%d" % (999999999999999999999999/3))'
333333333333333327740928

根据PEP 237bignum是任意大的(不仅仅是C long类型的大小)。并且Wikipedia表示Python的bignum是任意精度。

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

1 个答案:

答案 0 :(得分:25)

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

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

 >>> type(999999999999999999999999/3)
 <class 'float'>
 >>> type(999999999999999999999999//3)
 <class 'int'>

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

 python -c 'print("%d" % (999999999999999999999999//3))' 
 333333333333333333333333

如何编写兼容python 2.2+和3.3

的代码

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

 >>> from __future__ import division 

这将在2.2+代码中启用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'>