大约半个小时的时间思考“我做错了什么!?”在 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.
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(),结果得到了一个您意想不到的数字。
int()
您应该使用整数除法(在 Python 2 和 Python 3 中):
>>> 6366805760909027985741435139224001//7 909543680129861140820205019889143L
(结尾的 L 表示它是一个长整数,在 Python 3 中长整数和普通整数合并,因此没有结尾的 L)。