【问题标题】:Is Python incorrectly handling this "arbitrary precision integer"?Python 是否错误地处理了这个“任意精度整数”?
【发布时间】:2014-01-28 15:29:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在我的盒子里它按预期工作,即使增加 9 的数量
  • 嗯,问题似乎只出在 Python3 和 print 语句上
  • Python 确实 具有任意精度的整数。您的代码创建的数字不是整数。
  • 一个python3 -c "print(999999999999999999999999 / 3)" 会立即向您显示问题(它打印一个浮点数而不是整数)。

标签: python arbitrary-precision


【解决方案1】:

实际上,在 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'>

【讨论】:

  • 这确实给出了正确的任意精度输出: $ python -c 'print("%d" % (999999999999999999999999//3))' 333333333333333333333333
  • 请注意,// 运算符可用因为Python2.2(我相信在 2001 年左右发布)。所以它不是 python3 特性。
  • @Bakuriu 我认为他的意思是在 python2 中 // 被假定为 / 在两个整数之间,而在 python3 中你需要显式调用它。
  • @SethMMorton 是的,但从答案中并不清楚。有人可能会认为,由于在 python2 中行为不同,因此没有 // 运算符。如果有人想编写与两个版本兼容的代码,这会增加一些复杂性。我只是想明确一点,使用// 确实不会在这个意义上引入任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2014-11-01
  • 1970-01-01
  • 2011-06-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多