round和int之间的python差异

Lia*_*iam 4 python floating-point int python-2.7

我现在一直在玩python,我注意到一种奇怪的行为让我很好奇:float(int(n))和之间的区别是round(n)什么?

我什么时候应该使用一个,另一个或两者都不使用?

Yaa*_*lch 10

为了完整起见,让我增加两个功能,你的问题,并解释之间的差异float(int(x)),math.floor(x),round(x)math.ceil(x).

让我们从一个问题开始:"什么整数代表最好的数字1.6?" 我们有两个可能的答案(1和2),但有很多不同的原因,为什么一个答案可能比另一个答案更好:

  • int(1.6)==1:这是你切断小数时得到的结果.
  • math.floor(1.6)==1:它不到2.不完整的部分不计.
  • round(1.6)==2:因为2比1更接近.
  • math.ceil(1.6)==2:超过1.当你开始零件时,你必须支付全价.

让我们让python打印一个很好的表格,你会得到不同的x值:

from math import floor, ceil
tab='\t' 

print 'x \tint\tfloor\tround\tceil'
for x in (1.0, 1.1, 1.5, 1.9, -1.1, -1.5, -1.9):
    print x, tab, int(x), tab, floor(x), tab, round(x), tab, ceil(x)
Run Code Online (Sandbox Code Playgroud)

这是输出:

x       int floor   round   ceil
1.0     1   1.0     1.0     1.0
1.1     1   1.0     1.0     2.0
1.5     1   1.0     2.0     2.0
1.9     1   1.0     2.0     2.0
-1.1    -1  -2.0    -1.0    -1.0
-1.5    -1  -2.0    -2.0    -1.0
-1.9    -1  -2.0    -2.0    -1.0
Run Code Online (Sandbox Code Playgroud)

你看,这四个函数中没有一个是相同的.

  • floor朝向负无穷大:它总是选择最低的答案: floor(1.99)==1floor(-1.01)==-2.
  • ceil向无穷大方向发展:它总是选择最高的答案:ceil(1.01)==2ceil(-1.99)=-1.
  • int朝向零的方向:对于正面而言x,就像floor是负面x的一样ceil.
  • round四舍五入到最接近的解决方案:round(1.49)=1round(1.51)==2.当x恰好在两个数字之间时,round(x)从零开始舍入:round(1.5)==2round(-1.5)==-2.这与int(x)本案例中的做法相反.

请注意,int(x)始终返回一个整数---其他函数返回浮点数.

  • 很好的答案。我唯一的挑剔是程序员不将“int(x)”视为舍入,它会删除小数点后的所有内容,这在技术上称为“截断”(尽管您是正确的,其效果与舍入相同) -趋向零)。只是想我会提到这一点以避免与传统的舍入概念混淆。(注意:只要“x”是数字,“int(x)”就与“math.trunc(x)”相同) (3认同)
  • @ReignBough:注意:**你所有的方程都不精确** ---规则比你想象的更复杂:`round(0.5)==0`但是`int(0.5+0.5)==1`;`floor(-1.9)==-2` 但 `int(-1.9)==-1`; `ceil(1)==1` 但 `int(1)+1==2`。Python 有四个相似但略有不同的函数,因为在不同的情况下,您需要不同类型的舍入。我建议您首先了解四个函数之间的不同意图(如答案中所解释的),然后始终选择能够实现您真正想要的功能的函数。 (2认同)

Sil*_*ris 7

round(n)是一个循环浮点数的函数,int(n)将浮点数转换为整数,并通过截断它来删除小数部分.


Luk*_*e K 6

round是一种数学舍入,int只是转换为整数,本质上是截断该值。

取2个变量:

var1 = 5.5
var2 = 5.1
Run Code Online (Sandbox Code Playgroud)

如果我们把它们围起来

round(var1)
round(var2)
Run Code Online (Sandbox Code Playgroud)

我们分别得到 6.0 和 5.0。

但是,如果我们只是将它们转换为 int

int(var1)
int(var2)
Run Code Online (Sandbox Code Playgroud)

我们给他们俩都打了 5 分。

您可以在 python 解释器中自己测试一下。