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


127

如标题所示,我想取一个浮点数并将其四舍五入为最接近的整数。但是,如果它不是一个整数,那么我总是想舍入该变量,而不管它与下一个整数有多接近。有没有办法做到这一点?


2
一个可能的困难是IEEE浮点格式可以表示如此大的数字,以使粗度大于1。因此,尽管您可以向下舍入x,但是向下舍入x + 1并不能得到预期的结果。
dmckee ---前主持人小猫,

请发布一些示例。
Ashwini Chaudhary

Answers:



77

其中之一应起作用:

import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2

14
的输出math.trunc是整数,而的输出math.floor是浮点数。
evedovelli 2013年

6
@evedovelli:不再是了。type(math.floor(1.51)) -> inttype(math.trunc(1.51)) -> int作为python 3.6.0
SKPS

4
这些选项比“ int(x)”更明确,因此更具Python风格。
特里斯坦(Tristan)

43
x//1

//运算符返回师的地板上。由于除以1不会更改您的数字,所以这等于下限,但不需要导入。笔记:

  1. 这将返回一个浮点数
  2. 向-∞取整

不错的补充。 int(-1.1) == -1-1.1//1 == -2.0decimal.Decimal('-1.1')//1 == decimal.Decimal('-1')(如文档,要求2不是真正的decimal),所以依靠怎样//的行为是不完全稳定,今日连。
蒂诺

28

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

round(x-0.5)

它也适用于负数。


6
这是非常复杂的
Alon


9

很多人说可以使用int(x),并且在大多数情况下都可以使用,但是存在一些问题。如果OP的结果是:

x = 1.9999999999999999

它会四舍五入

x = 2

9月16日之后,它会四舍五入。如果您确定您永远不会遇到这种事情,那么这并不是什么大不了的事情。但这是要牢记的。


17
那是因为1.9999999999999999实际上等于2.0内部的float64表示形式。即 解析为浮点数后,它已经被四舍五入,因为64位浮点数不能表示那么多有效数字。您可以通过评估验证1.9999999999999999 == 2.0。而且,如果您怀疑equals操作会对浮点数进行四舍五入,则可以将二进制表示形式与进行比较struct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0),后者也相等。
blubberdiblub 2015年

4
而且,如果这正是您的意思,那么我看不出出了什么问题int()。值已经是2.0,它会它高兴地转换成2
blubberdiblub

1
如果OP出于某种原因(或将来要阅读的人)出于某种原因而使用最接近的整数(而不是舍入值),则需要牢记。
lokilindo '16

3
@lokilindo但这与无关int(),它仅与的不正确使用有关float,因为在编译时(在执行时调用)1.9999999999999999会四舍五入。如果为变量使用正确的数据类型,那么一切都会按预期进行: 给2.0 int()int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))1
Tino

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.

感谢您的回答。下次如果您编写正确的代码(带括号)并提供一些文档,您将获得更好的接待。
杰夫2014年

2
round一年前提出这个问题时,已经讨论过并被拒绝作为答案。OP要math.floor
亚当·斯密

3

如果您使用numpy,则可以使用以下解决方案,该解决方案也适用于负数(它也适用于数组)

import numpy as np
def round_down(num):
    if num < 0:
        return -np.ceil(abs(num))
    else:
        return np.int32(num)
round_down = np.vectorize(round_down)

round_down([-1.1, -1.5, -1.6, 0, 1.1, 1.5, 1.6])
> array([-2., -2., -2.,  0.,  1.,  1.,  1.])

我认为如果仅使用math模块而不是numpy模块,它也将起作用。


1

不知道您是否解决了这个问题,但我偶然发现了这个问题。如果要去除小数点,可以使用int(x),它将消除所有十进制数字。无需使用round(x)。



-1

这可能很简单,但是您难道不可以将其舍去然后减去1吗?例如:

number=1.5
round(number)-1
> 1

4
这为整数提供了错误的答案。例如,2.0四舍五入为2,如果你减去1,你得到不正确的结果1
帕斯卡尔Cuoq

@PascalCuoq我不明白你的问题。您想要1.0的结果吗?因为OP显然想四舍五入,然后将数字取整到最接近的数字integer
bad_keypoints 2015年

1
@bad_keypoints我不认为OP希望轮2.0比1
帕斯卡尔Cuoq

@PascalCuoq对不起,我只是回头看了我们的评论主题中的答案。
bad_keypoints 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.