我想知道是否有任何理由不使用//
运算符将数字舍入为整数。我没有在这个主题上看到太多,或者真的知道要找什么来了解更多信息。
>>> 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范围内?
答案 0 :(得分:3)
不使用它的主要原因是有完美的内置函数int
和round
已经这样做了,这可能是有效的,不会混淆读你的人代码。
评论中指出的另一个原因是//1
相当于math.floor
而不是int
或round
。 -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
技巧。
如果我要查看此代码,我会先怀疑是一个错误,然后是第二个功能。