【问题标题】:Round a floating-point number down to the nearest integer?将浮点数四舍五入到最接近的整数?
【发布时间】:2013-06-13 01:55:01
【问题描述】:

我想取一个浮点数并将其向下舍入到最接近的整数。但是,如果它不是一个整体,我总是想要向下舍入变量,无论它与下一个整数有多接近。有没有办法做到这一点?

【问题讨论】:

  • 一个可能的困难是 IEEE 浮点格式可以表示如此大的数字,以至于宏度大于 1。所以,虽然你可以向下舍入 x,但向下舍入 x+1 不会给你结果你期待。
  • 请贴一些例子。

标签: python floating-point integer rounding


【解决方案1】:

简单

print int(x)

也可以。

【讨论】:

  • int(0.6) = 0 而不是 1
  • @HelinWang 这正是 OP 要求的。
  • 这似乎是最 Pythonic 的方法。
  • 这适用于正数,但负数会四舍五入:int(-23.3) == 23
  • 对于600851475143等整数范围以外的数字不起作用,它基本上会标记内存错误。
【解决方案2】:

其中一个应该可以工作:

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

【讨论】:

  • math.trunc 的输出是整数,math.floor 的输出是浮点数。
  • @evedovelli:现在不是了。 type(math.floor(1.51)) -> inttype(math.trunc(1.51)) -> int python 3.6.0
  • 这些选项比“int(x)”更明确,因此更符合 Pythonic。
【解决方案3】:
x//1

// 运算符返回分区的楼层。由于除以 1 不会改变你的数字,这相当于 floor 但不需要导入。 备注:

  1. 这会返回一个浮点数
  2. 这轮到 -∞

【讨论】:

  • 不错的补充。 int(-1.1) == -1-1.1//1 == -2.0 但是 decimal.Decimal('-1.1')//1 == decimal.Decimal('-1')(如文档所述,声明 2 不适用于 decimal),因此即使在今天,依赖 // 的行为方式也不是完全稳定的。
【解决方案4】:

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

round(x-0.5)

它也适用于负数。

【讨论】:

  • 极其复杂的
  • 但是对于像 1: 1 - 0.5 = 0.5 和 round(0.5) = 0 这样已经四舍五入的数字是错误的,所以 1 将被转换为 0
【解决方案5】:

我认为你需要一个楼层函数:

math.floor(x)

【讨论】:

  • 在python 2中它返回一个浮点数,而在python 3中它返回一个int
  • int(math.floor(x)) 或 float(math.floor(x))
【解决方案6】:

很多人说要使用int(x),这在大多数情况下都可以,但是有一个小问题。如果 OP 的结果是:

x = 1.9999999999999999

它会四舍五入

x = 2

在 16 号 9 号之后,它会四舍五入。如果你确定你永远不会遇到这样的事情,这没什么大不了的。但要牢记这一点。

【讨论】:

  • 那是因为1.9999999999999999在内部float64表示中实际上等于2.0。 IE。一旦它被解析为浮点数,它就已经四舍五入了,因为 64 位浮点数不能代表那么多有效数字。您可以通过评估 1.9999999999999999 == 2.0 来验证这一点。如果你怀疑 equals 操作对浮点数做了一些舍入,你可以将二进制表示与 struct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0) 进行比较,这也是相等的。
  • 如果这正是你的意思,那么我看不出int() 有什么问题。该值已经是 2.0,它会愉快地将其转换为 2。
  • 如果 OP(或将来阅读此内容的任何人)的意图是出于任何原因使用最接近的整数(而不是四舍五入值),那么请记住这一点。
  • @lok​​ilindo 但这与 int() 无关,它仅与 float 的不当使用有关,因为 1.9999999999999999 被四舍五入2.0 在编译时(而int() 在执行时被调用)。如果您为变量使用正确的数据类型,一切都会按预期工作:int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999')) 给出1
【解决方案7】:

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

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.

【讨论】:

  • 感谢您的回答。如果您编写正确的代码(右括号)并提供一些文档,下次您将获得更好的接收。
  • round 在一年前提出这个问题时已被讨论并拒绝作为答案。 OP 想要math.floor
【解决方案8】:

如果您使用 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 模块,它也会起作用。

【讨论】:

    【解决方案9】:

    只需进行 round(x-0.5) 这将始终返回下一个向下舍入的浮点整数值。你也可以通过 do round(x+0.5) 轻松四舍五入

    【讨论】:

      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

        这可能很简单,但你不能把它四舍五入然后减去 1 吗? 例如:

        number=1.5
        round(number)-1
        > 1
        

        【讨论】:

        • 这给出了整个整数的错误答案。例如,2.0 向上取整为 2,如果减去 1,则会得到不正确的结果 1。
        • @PascalCuoq 我不明白你的问题。你想要 1.0 作为结果吗?因为 OP 显然想将数字四舍五入到最接近的 integer
        • @bad_keypoints 我不认为 OP 想要将 2.0 舍入到 1。
        • @PascalCuoq 抱歉,我刚刚在我们所在的评论线程中回顾了答案。
        【解决方案12】:

        我使用此代码从数字中减去 0.5,然后将其四舍五入,它是向下舍入的原始数字。

        圆形(a-0.5)

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多