最近这完全让我措手不及。这是因为我从20世纪70年代就开始用 C 语言编程,现在才开始学习 Python 的细节。就像 math.floor ()的这种奇怪的行为。
Python 的数学库是如何访问 C 标准数学库的。C 标准数学库是浮点数字函数的集合,比如 sin ()、 cos ()、 sqrt ()。数值计算上下文中的 floor ()函数总是返回一个 float。已经50年了。这是数值计算标准的一部分。对于那些熟悉 C 语言数学库的人来说,我们不能理解它仅仅是“数学函数”。我们认为它是浮点算法的集合。它可以更好地命名为 NFPAL-数值浮点算法库之类的东西。:)
了解这段历史的人会立即将 python 数学模块看作是长期建立的 C 浮点库的包装器。因此,我们不假思索地期望 math.floor ()与 C 标准库 floor ()是相同的函数,后者接受一个 float 参数并返回一个 float 值。
然而,Python 是一种不同的野兽,这是有充分理由的。它试图解决一个与 C 不同的问题集。Python 的静态类型对于快速的原型设计和开发来说是非常好的,但是当用一种类型的对象(比如 float)测试的代码在传递 int 参数时出现微妙的失败并且很难找到方法时,它会产生一些非常复杂和难以发现的 bug。正因为如此,Python 做出了许多有趣的选择,在其他历史规范的基础上尽可能减少意外错误。
改变除法总是返回一个浮点数(或某种形式的非整数)是正确的方向。同样的道理,使//成为一个 floor (a/b)函数,而不是一个“ int 除法”也是合乎逻辑的。