根据Python integer ranges中的答案,Python应该具有“任意精度整数”。但是这个结果显然不任意精度:
$ python -c 'print("%d" % (999999999999999999999999/3))'
333333333333333327740928
根据PEP 237,bignum
是任意大的(不仅仅是C long
类型的大小)。并且Wikipedia表示Python的bignum
是任意精度。
那么为什么上面一行代码的结果不正确?
答案 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
这实际上很简单,只需添加:
>>> 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'>