10

我将生成这个随机数,例如 12.75 或 1.999999999 或 2.65

我想总是将此数字四舍五入到最接近的整数整数,因此 2.65 将四舍五入为 2。

抱歉问了,但经过多次搜索我找不到答案,谢谢:)

4

6 回答 6

26

您可以选择我们int()math.trunc()math.floor()。他们都会为正数做你想做的事:

>>> import math
>>> math.floor(12.6)  # returns 12.0 in Python 2
12   
>>> int(12.6)
12
>>> math.trunc(12.6)
12

但是,请注意它们对负数的行为不同:int 和math.trunc将变为 0,而math.floor总是向下:

>>> import math
>>> math.floor(-12.6)  # returns -13.0 in Python 2
-13
>>> int(-12.6)
-12
>>> math.trunc(-12.6)
-12

请注意,math.floorandmath.ceil用于在 Python 2 中返回浮点数。

另请注意,intandmath.trunc两者(乍一看)似乎都在做同样的事情,尽管它们的确切语义不同。简而言之: int 用于一般/类型转换,math.trunc专门用于数字类型(有助于使您的意图更清晰)。

如果int您真的不关心差异,如果您想转换字符串,或者如果您不想导入库,请使用。如果trunc您想绝对明确您的意思,或者如果您想确保您的代码对非内置类型正确工作,请使用此选项。

更多信息如下:


Python 2 与 Python 3 中的 Math.floor()

请注意,math.floor(and math.ceil) 从 Python 2 到 Python 3 略有变化——在 Python 2 中,这两个函数都将返回一个浮点数而不是一个 int。这在 Python 3 中进行了更改,因此这两个方法都返回一个 int(更具体地说,它们__float__在给定的任何对象上调用该方法)。因此,如果您使用的是 Python 2,或者希望您的代码保持两个版本之间的兼容性,那么通常可以安全地使用int(math.floor(...)).

有关为什么进行此更改的更多信息以及有关int(math.floor(...))在 Python 2 中执行的潜在陷阱的更多信息,请参阅 为什么 Python 的 math.ceil() 和 math.floor() 操作返回浮点数而不是整数?

int 与 math.trunc()

乍一看,int()math.trunc()方法似乎是相同的。主要区别是:

  • 整数(...)
    • int 函数将接受浮点数、字符串和整数。
    • 运行int(param)将调用该param.__int__()方法以执行转换(然后将尝试调用__trunc__如果__int__未定义)
    • 魔术__int__方法并不总是明确定义的——在一段时间内,事实证明__int__应该如何工作的确切语义和规则在很大程度上取决于实现类。
    • int当您要将一般对象转换为 int时,应使用该函数。这是一种类型转换方法。例如,您可以通过执行int("42")(或更改 base: 之类的操作int("AF", 16) -> 175)将字符串转换为整数。
  • 数学.trunc(...)
    • trunc 将只接受数字类型(整数、浮点数等)
    • 运行math.trunc(param)函数将调用该param.__trunc__()方法以执行转换
    • __trunc__魔术方法的确切行为和语义在PEP 3141中精确定义(更具体地说,在更改操作和 __magic__ 方法部分)。
    • math.trunc当您想要获取现有实数并专门截断并删除其小数以生成整数类型时,应使用该函数。这意味着不像int,math.trunc是纯数字运算。

综上所述,事实证明,无论您使用 int 还是 trunc,所有 Python 的内置类型的行为都完全相同。这意味着,如果您所做的只是使用常规整数、浮点数、分数小数,则可以自由使用 int 或 trunc。

但是,如果您想非常准确地了解您的意图是什么(即,如果您想完全清楚您是在地板上还是截断),或者如果您正在使用具有不同实现的自定义数字类型__int____trunc__, 那么最好使用math.trunc.

您还可以在Python 的开发者邮件列表中找到有关此主题的更多信息和辩论。

于 2013-10-21T17:50:00.607 回答
3

您可以使用内置的 python 函数轻松完成此操作,只需使用两个正斜杠并除以 1。

>>> print 12.75//1
12.0
>>> print 1.999999999//1
1.0
>>> print 2.65//1
2.0
于 2013-10-21T18:59:46.243 回答
2

无需导入任何模块,如数学等.... python bydeafault 如果您只是简单地按整数类型转换,它会转换

>>>x=2.65
>>>int(x)
2
于 2013-10-22T04:25:07.237 回答
1

我不确定您是否想要 math.floor、math.trunc 或 int,但是...几乎可以肯定它是这些功能之一,您可能可以阅读文档并更容易地做出决定,而不是对 USB 进行足够的解释为你决定。

于 2013-10-21T17:49:27.073 回答
0

显然,Michael0x2a 的回答是你应该做的。但是,你总是可以有点创意。

int(str(12.75).split('.')[0])
于 2015-10-28T23:35:24.313 回答
0

如果您只寻找最接近的整数部分,我认为最好的选择是使用math.trunc()函数。

import math
math.trunc(123.456)

您也可以使用 int()

int(123.456)

这两个函数的区别在于 int() 函数还处理字符串数字转换,其中 trunc() 只处理数值。

int('123')
# 123

哪里 trunc() 函数会抛出异常

math.trunc('123')

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-62-f9aa08f6d314> in <module>()
----> 1 math.trunc('123')

TypeError: type str doesn't define __trunc__ method

如果你知道你只处理数字数据,你应该考虑使用 trunc() 函数,因为它比 int() 快

timeit.timeit("math.trunc(123.456)", setup="import math", number=10_000)
# 0.0011689490056596696

timeit.timeit("int(123.456)", number=10_000)
# 0.0014109049952821806
于 2018-09-20T14:25:50.387 回答