【发布时间】:2017-06-01 21:04:40
【问题描述】:
2.5 // 2.0 在 Python 3.x 中返回 float 而不是 int 背后的基本原理是什么?
如果是整数值,为什么不把它放在int 对象中呢?
[编辑]
我正在寻找事实的理由。这样做的理由是什么。还没找到。
[编辑2]
与floor 的关系比“楼层划分”一词所暗示的问题更严重!
floor(3.5 / 5.5) == 0(整数)
而
3.5 // 5.5 == 0.0(浮点数)
这里还不能辨别任何逻辑:(
[编辑3]
来自 PEP238:
在一个 统一模型,整数 1 应该与 浮点数 1.0(不精确除外),以及两者 在所有数字上下文中的行为应该相同。
一切都很好,但是像 Numpy 这样的不重要的库在提供浮点数作为索引时会抱怨,即使它们是不可或缺的。所以“无法区分”还不是现实。花了一些时间寻找与此相关的错误。得知// 的真实性质,我感到非常惊讶。而且从文档中(对我来说)来说并不是那么明显。
由于我对 Python 3.x 的设计相当信任,我想我一定错过了一个非常明显的理由来以这种方式定义 //。但现在我想知道...
【问题讨论】:
-
@SparklePony 这可能是规则,但规则不是理由。我认为这是一个有趣的问题。
-
@SparklePony:很明显这两个参数都是浮点数。这并不意味着输出必须是浮点数。我们已经有 1/2 返回一个浮点数;为什么不让 1.0//2.0 返回一个 int?
-
让我直截了当地说...
/是有问题的,因为模棱两可,其结果取决于数字的类型。所以我们修复了 and 添加了一个具有相同(嗯,类似)问题的新运算符。多么迷人…… -
@KarolyHorvath 好吧,结果的 type 取决于输入,但是使用“新”
/和//你不会对结果被四舍五入只是因为输入碰巧不再是整数了。
标签: python