大概半个小时的时间在想“我做错了什么!?”在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.
答案 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