我如何只在Python中舍入一个数字/浮点数?

时间:2013-10-21 17:46:40

标签: python integer rounding

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

我希望始终将此数字向下舍入到最接近的整数整数,因此2.65将舍入为2。

很抱歉,但经过无数次搜索后我找不到答案,谢谢:)

6 个答案:

答案 0 :(得分:19)

您可以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.floormath.ceil用于在Python 2中返回浮点数。

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

如果您不关心差异,是否要转换字符串,或者您不想导入库,请使用int。如果您希望绝对明确您的意思,或者您希望确保代码能够正常运行非内置类型,请使用trunc

以下更多信息:


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

请注意math.floor(和math.ceil)从Python 2略微改为Python 3 - 在Python 2中,两个函数都将返回float而不是int。这在Python 3中已更改,因此两个方法都返回一个int(更具体地说,它们在给定的任何对象上调用__float__方法)。那么,如果您使用的是Python 2,或者希望您的代码能够保持两个版本之间的兼容性,那么int(math.floor(...))通常是安全的。

有关更改原因的更多信息+关于在Python 2中执行int(math.floor(...))的潜在缺陷,请参阅 Why do Python's math.ceil() and math.floor() operations return floats instead of integers?

int vs math.trunc()

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

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

所有这一切都表明,无论你使用int还是trunc,所有Python的内置类型都会表现得完全相同。这意味着如果你所做的只是使用常规整数,浮点数,fractionsdecimals,你可以自由地使用int或trunc。

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

您还可以在Python's developer mailing list上找到有关此主题的更多信息和争论。

答案 1 :(得分:2)

你可以使用内置的python函数轻松完成,只需使用两个正斜杠并除以1.

>>> print 12.75//1
12.0
>>> print 1.999999999//1
1.0
>>> print 2.65//1
2.0

答案 2 :(得分:2)

无需导入任何模块,如数学等.... python bydeafault如果你只是按整数键入cast

就转换它
>>>x=2.65
>>>int(x)
2

答案 3 :(得分:1)

我不确定你是否想要math.floor,math.trunc或int,但是......它几乎可以肯定是这些函数中的一个,你可以阅读文档并且比你能解释得更容易为usb决定你。

答案 4 :(得分:1)

显然,Michael0x2a的答案就是你应该做的。但是,你总能有点创意。

int(str(12.75).split('.')[0])

答案 5 :(得分: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