Python回合用'n // 1`

时间:2014-08-14 20:01:02

标签: python division integer-division

我想知道是否有任何理由不使用//运算符将数字舍入为整数。我没有在这个主题上看到太多,或者真的知道要找什么来了解更多信息。

>>> from random import random
>>> random() * 20 // 1
1.0
>>> random() * 20 // 1
0.0
>>> random() * 20 // 1
16.0
>>> random() * 20 // 1
11.0
>>> random() * 20 // 1
0.0

除了需要在结果中加1(不能得到1-20而不是0-19的范围)或者这个实际结果是否在0-20范围内?

4 个答案:

答案 0 :(得分:3)

不使用它的主要原因是有完美的内置函数intround已经这样做了,这可能是有效的,不会混淆读你的人代码。

评论中指出的另一个原因是//1相当于math.floor而不是intround-2.5 // 1返回一个浮点-3.0,而int(-2.5)返回一个整数-2

有经验的程序员可能会对//1所做的事情感到困惑这一事实,很好地说明了为什么最好使用为此目的设计的现有功能之一 - 他们的行为方式明确定义,记录和是一致的。

答案 1 :(得分:3)

不使用//将随机浮点数转换为随机int的原因是因为您可以直接跳到随机int:

>>> import random
>>> random.random()      # [0.0, 1.0)
0.4399641241469895
>>> random.uniform(0,20) # [0.0, 20.0)
11.494311814130072
>>> random.randint(0,20) # [0, 20) or [0, 19]
7

要回答您的问题:x // y执行x乘y的最低分数,因此您的结果将始终向下舍入。要舍入到最接近的整数:

>>> x = 1.7
>>> x // 1
1.0
>>> int(x)
1
>>> (x + 0.5) // 1
2.0
>>> int(x + 0.5)
2
>>> round(x)
2.0
>>> int(round(x))
2

在转换为int之前添加0.5(或减去负数)与round(x)(内置)相同。值得注意的是x // 1向下舍入,但int(x)向零舍入。

random.random() * 20 // 1无法返回20因为随机半开。但是,random.uniform(0,20) // 1可以返回20,但发生这种情况的可能性接近于零。

答案 2 :(得分:1)

好吧,//不会对整数进行舍入。 Round表示返回最接近的整数,但请检查:

print round(1.9)     # 2.0
print 1.9 // 1       # 1.0

答案 3 :(得分:0)

它为您提供了一系列0-19//实际上是地板分区仍然会产生一个浮点数,但我读到这就是您的意思。

不使用的可能原因可能是// 1不是用于表达它的非常简洁的语法。 Python非常关注可读性,这种语法对它的作用并不十分明显。这就像JavaScript的~~x技巧。

如果我要查看此代码,我会先怀疑是一个错误,然后是第二个功能。