Python 3奇怪的划分

ine*_*xxt 4 python largenumber rounding integer-division python-3.x

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

Python2:

int(6366805760909027985741435139224001        # This is 7**40.
    / 7) == 909543680129861140820205019889143 # 7**39
Run Code Online (Sandbox Code Playgroud)

Python3:

int(6366805760909027985741435139224001 
    / 7) == 909543680129861204865300750663680 # I have no idea what this is.
Run Code Online (Sandbox Code Playgroud)

Jam*_*ing 6

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

// 
Run Code Online (Sandbox Code Playgroud)

在Python 3中进行整数除法.

  • 你也可以在Python 2中使用`//`,即同样的源可以在Python 2和3上使用.`(7**40 // 7)== 7**39`.`from __future__ import division`在Python 2上为`/`启用Python 3行为. (2认同)

Len*_*bro 5

Python 3不是"四舍五入".它的作用是它会在分裂后返回一个浮点数.因此,在Python 2中:

>>> 4/2
2
Run Code Online (Sandbox Code Playgroud)

在Python 3中:

>>> 4/2
2.0
Run Code Online (Sandbox Code Playgroud)

这样做的原因是简单的.在Python 2中,/使用整数时进行整数除法会产生一些令人惊讶的结果:

>>> 5/2
2
Run Code Online (Sandbox Code Playgroud)

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

>>> 5/2
2.5
Run Code Online (Sandbox Code Playgroud)

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

>>> 6366805760909027985741435139224001/7
9.095436801298612e+32
Run Code Online (Sandbox Code Playgroud)

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

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

>>> 6366805760909027985741435139224001//7
909543680129861140820205019889143L
Run Code Online (Sandbox Code Playgroud)

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