Python 3奇怪的划分

时间:2013-12-28 03:35:27

标签: python python-3.x rounding integer-division largenumber

大概半个小时的时间在想“我​​做错了什么!?”在5行代码..因为Python3以某种方式舍入大整数。任何人都知道为什么会出现这样的问题:

Python2:

int(6366805760909027985741435139224001        # This is 7**40.
    / 7) == 909543680129861140820205019889143 # 7**39

Python3:

int(6366805760909027985741435139224001 
    / 7) == 909543680129861204865300750663680 # I have no idea what this is.

3 个答案:

答案 0 :(得分:6)

在Python 3中/是浮点除法,所以它可能不会像整数那样对待你的参数。使用

// 

在Python 3中进行整数除法。

答案 1 :(得分:5)

Python 3不是“围绕大整数”。它的作用是它会在分裂后返回一个浮点数。因此,在Python 2中:

>>> 4/2
2

在Python 3中:

>>> 4/2
2.0

原因很简单。在Python 2中,/在使用整数时是整数除法有一些令人惊讶的结果:

>>> 5/2
2

糟糕!在Python 3中,这是固定的:

>>> 5/2
2.5

这意味着在Python 3中,你的部门返回一个浮点数:

>>> 6366805760909027985741435139224001/7
9.095436801298612e+32

此浮点数的精确度低于您需要的数字。 然后,将其转换为int()的整数,并得到一个您不期望的数字。

您应该使用整数除法(在Python 2和Python 3中):

>>> 6366805760909027985741435139224001//7
909543680129861140820205019889143L

(尾随L表示它是一个长整数,在Python 3中,长整数和普通整数合并,因此没有尾随L)。

答案 2 :(得分:-1)

您可能对分数模块感兴趣:

$ pythons 'import fractions; print("%.30f" % fractions.Fraction("1/9"))'
/usr/local/cpython-2.4/bin/python
   Traceback (most recent call last):
     File "<string>", line 1, in ?
   ImportError: No module named fractions
/usr/local/cpython-2.5/bin/python
   Traceback (most recent call last):
     File "<string>", line 1, in <module>
   ImportError: No module named fractions
/usr/local/cpython-2.6/bin/python 0.111111111111111104943205418749
/usr/local/cpython-2.7/bin/python 0.111111111111111104943205418749
/usr/local/cpython-3.0/bin/python 0.111111111111111104943205418749
/usr/local/cpython-3.1/bin/python 0.111111111111111104943205418749
/usr/local/cpython-3.2/bin/python 0.111111111111111104943205418749
/usr/local/cpython-3.3/bin/python 0.111111111111111104943205418749
/usr/local/cpython-3.4/bin/python 0.111111111111111104943205418749
/usr/local/pypy-2.2/bin/pypy 0.111111111111111104943205418749
/usr/local/jython-2.7b1/bin/jython 0.111111111111111100000000000000