小能豆

Python 3 奇怪的划分

py

大约半个小时的时间思考“我做错了什么!?”在 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.

阅读 22

收藏
2024-11-15

共1个答案

小能豆

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)。

2024-11-15