这篇文章系列翻译自Python的父亲Guido van Rossum的系列博客“The History of Python”。这个博客系列对理解Python及其进化非常有帮助。经Guido同意,推荐在这里翻译。希望大家喜欢。请多多指导。(大卫亚设)。

系列地址:

1

今天又有人问我,为什么python的整数除法不像c语言一样四舍五入成0?

对于正整数,两种舍入方法的结果是相同的:

5//2

2

如果其中一个为负,则结果不接近于0(接近于负无穷大)。

-5/2

-3

5//-2

-3

这个问题困扰着一些人,但实际上有数学考虑。除法操作(//)和除法操作(%)是一起实现数学关系的组合(所有变量都是整数)。

# a/b=q剩馀的r

也就是说,

# b*q r=a,其中0=r b

如果a为负数(B保持正数),则有两个选项。一个将Q舍入为0,剩下的R变成负值,即0=ABS (R) B。另一个是,如果将Q舍入到负无穷大,则其馀设置将保持不变。

数学家们总是倾向于后一种选择。(见维基百科)

在Python,我们选择了后一种方案。因为在实际应用中,A可以是正数,也可以是负数。

以POSIX时间戳(1970年后的秒)为例,因为每天24 * 3600=86400秒,所以只需要t% 86400。如果时间戳为负数(即,要在1970年之前获得正确的结果),则只能舍入到非零以下。

我能想到的另一个例子是图像点的计算。而且我确信还有很多其他的例子。

顺便说一下,如果B取负数,整个等式就会反转。0=r b。

2

那么,c语言为什么采用零舍入?可能是因为当时的硬件设计——在最古老的硬件中,负数被表示为“符号数字”,而不是现在常用的补充代码(至少整数是)。

我用的第一台电脑是CDC主机。整数和浮点数均以补码表示,60个1为负0。

Tim Peters担心我会把这个原则扩展到浮点数上。他可能是对的。当x为非常小的负数时,向下的原则会导致x% 1.0的精度损失。但是,这个问题并不影响让整数采用下调原则。

PS。我使用的符号不是/,而是//。这是python 3的语法。也可以在python 2中使用。这意味着用户明确使用除法而不是除法。Python 2的/操作可能不明确,因为如果两个参数都是整数,则仅返回整数;如果有浮点参数,则返回浮点数。但这是另一个故事。可以参考PEP 238。

公众号:ReadingPython