将浮点数舍入到最近的整数?

Ant*_*rez 101 python floating-point integer rounding

正如标题所示,我想取一个浮点数并将其向下舍入到最接近的整数.但是,如果它不是一个整体,我总是想要舍入变量,无论它与下一个整数的接近程度如何.有没有办法做到这一点?

Mak*_*eli 145

简单

print int(x)
Run Code Online (Sandbox Code Playgroud)

也会奏效.

  • @HelinWang这正是OP所要求的. (32认同)
  • 这适用于正数,但负数将被四舍五入:`int(-23.3)== 23` (21认同)
  • int(0.6)= 0而不是1 (5认同)
  • 这似乎是最恐怖的方法. (3认同)
  • 与“math.floor”相比,我更喜欢这个解决方案:人们应该知道“int”函数如何工作以查看向下舍入的情况。该解决方案还依赖于“int”函数的实现细节(尽管它不太可能改变)。另一方面,“math.floor”是明确的:只需查看它就足以确保会发生向下舍入。 (3认同)
  • 并且不适用于超出整数范围的数字,例如 600851475143,它基本上会标记内存错误。 (2认同)
  • @MikhailGerasimov:这甚至与 `math.floor` 不一样。转换为整数是通过向 0 截断来完成的,就像在 C 中一样。我编辑了答案,以便让未来的读者清楚地了解它的作用(并向读者介绍舍入方向的概念,因为如果他们了解下限与截断,他们就会知道可能不必用谷歌搜索这个。)这涉及到在代码之外重写整个文本,因此如果您认为不同的措辞对未来的读者最有帮助,您可能需要重新措辞其中的一些内容。 (2认同)

U2E*_*EF1 70

其中一个应该工作:

import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2
Run Code Online (Sandbox Code Playgroud)

  • `math.trunc`的输出是一个整数,而`math.floor`的输出是一个浮点数. (12认同)
  • @evedovelli:不再了.`type(math.floor(1.51)) - > int`和`type(math.trunc(1.51)) - > int`从`python 3.6.0开始 (6认同)
  • 这些选项比“ int(x)”更明确,因此更具Python风格。 (2认同)

Huy*_*y D 33

x//1
Run Code Online (Sandbox Code Playgroud)

//运算符返回除法的最低点.由于除以1不会改变您的数字,这相当于楼层,但不需要导入.注意:
1)这会返回一个浮点
2)这个向-∞舍入


voi*_*urn 26

我认为你需要一个地板功能:

math.floor(x)的

  • 在python 2中它返回一个浮点数,而在python 3中它返回int (5认同)

小智 26

要获得浮点结果,只需使用:

round(x-0.5)
Run Code Online (Sandbox Code Playgroud)

它也适用于负数.

  • 非常复杂的 (5认同)
  • 但对于已经四舍五入的数字,例如 1: 1 - 0.5 = 0.5 和 round(0.5) = 0,这是错误的,因此 1 将转换为 0 (2认同)

lok*_*ndo 7

很多人说要使用:

        int(x)
Run Code Online (Sandbox Code Playgroud)

在大多数情况下都可以,但是有一个小问题。如果OP的结果是:

     x = 1.9999999999999999
Run Code Online (Sandbox Code Playgroud)

它会四舍五入

     x = 2
Run Code Online (Sandbox Code Playgroud)

9月16日之后,比赛将开始。如果您确定永远不会遇到这样的事情,这不是什么大不了的事情。但这是要牢记的。

  • 这是因为在内部float64表示中,“ 1.9999999999999999”实际上等于“ 2.0”。即 解析为浮点数后,它已经被四舍五入,因为64位浮点数不能表示那么多有效数字。您可以通过评估`1.9999999999999999 == 2.0'来验证。而且,如果您怀疑equals操作会对浮点数进行四舍五入,则可以将二进制表示形式与struct.pack(“ d”,1.9999999999999999)== struct.pack(“ d”,2.0)进行比较,后者也相等。 (14认同)
  • 而且,如果这正是您的意思,那么我看不出int()有什么问题。该值已经是2.0,它将愉快地转换为2。 (4认同)
  • @lokilindo但这与`int()`无关,它仅与**不正确地使用`float` **有关,因为在编译时将`1.9999999999999999`舍入为`2.0` ** *(在执行时调用`int()`)。如果为变量使用正确的数据类型,则一切都会按预期工作:`int(decimal.Decimal('1.99999999999999999999999999999999999999999999999999999999999)))得出1。 (3认同)

小智 6

如果您不想导入数学,可以使用:

int(round(x))

这是一篇文档:

>>> help(round)
Help on built-in function round in module __builtin__:

round(...)
    round(number[, ndigits]) -> floating point number

    Round a number to a given precision in decimal digits (default 0 digits).
    This always returns a floating point number.  Precision may be negative.
Run Code Online (Sandbox Code Playgroud)

  • 一年前,当问到这个问题时,'round`已经被讨论过并被拒绝了.OP想要`math.floor`. (2认同)