【问题标题】:python difference between round and intpython round 和 int 的区别
【发布时间】:2017-09-25 10:24:09
【问题描述】:

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

我什么时候应该使用其中一个、另一个或一个都不使用?

【问题讨论】:

  • 在第一种情况下,您首先将数字转换为 int,因此逗号后的所有数字都消失了,然后您再次转换为浮点数,例如 3.6 将导致 3.0,这在数学上是错误的。圆是数学圆
  • round 也可以使用第二个参数来表示精度。这使它与float(int(n)) 不同。至于现在都不是,那太宽泛了。
  • 您是否尝试过类似的方法:round(1.7)float(int(1.7))
  • 你注意到了什么奇怪的行为?
  • 他们给出了相同的结果@PeterWood

标签: python python-2.7 floating-point int


【解决方案1】:

为了完整起见,让我在你的问题中再添加两个函数,并解释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)

这是输出:

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

你看到这四个函数中没有一个是相等的。

  • 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)视为舍入,它会删除小数点后的所有内容,技术上称为truncation(尽管您是正确的,效果与舍入相同-零)。只是想我会提到这一点,以避免与传统的舍入概念混淆。 (注意:int(x)math.trunc(x) 相同,只要 x 是数字)
【解决方案2】:

round 是一个数学舍入,int 只是转换为一个整数,实际上是截断值。

取2个变量:

var1 = 5.5
var2 = 5.1

如果我们将它们四舍五入

round(var1)
round(var2)

我们分别得到 6.0 和 5.0。

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

int(var1)
int(var2)

我们都得到 5 个。

您可以在 python 解释器中自行测试。

【讨论】:

  • 注意:round() 在 Py3 中没有第二个参数会返回一个 int
  • 问题被标记为python2,所以我没有检查python3..但我实际上并不知道,所以谢谢(我每天仍然主要使用python 2)
  • 负数呢?
  • 那是另一个需要注意的区别。与数学和 python2 不同,python3 round 向下舍入 4.5,这使得它与转换为 int 基本相同
  • 是的,数学舍入和 python 舍入之间存在差异,因为 python 的 round() 将更喜欢 even 数字以获得 2 个相等距离的结果,round(4.5) -> 4round(3.5) -> 4。另请注意:根据文档“round() 的浮点行为可能令人惊讶” - 浮点运算的限制。
【解决方案3】:

round(n) 是一个对浮点数进行四舍五入的函数,int(n) 会将浮点数转换为整数,并通过截断它来去掉小数部分。

【讨论】:

  • 负数呢?
  • int(-3.6) 将给出 -3 和 round(-3.6) 将给出 -4 所以仍然舍入取整并截断 int()。
  • @Veltro float(int(n)) 将具有与 int(n) 相同的行为,但会将其从 int 转换为 float
猜你喜欢
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2012-01-02
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
相关资源
最近更新 更多