【问题标题】:How do you round UP a number?你如何四舍五入一个数字?
【发布时间】:2011-01-22 07:49:23
【问题描述】:

如何在 Python 中将数字向上取整?

我试过round(number),但它会将数字四舍五入。示例:

round(2.3) = 2.0 

而不是 3,如我所愿。

我试过int(number + .5),但它又把数字四舍五入了!示例:

int(2.3 + .5) = 2

【问题讨论】:

  • 如果数字是整数,round(number + .5) 不起作用。 round(3+.5) == 4,当你真正想要3时。

标签: python floating-point integer rounding


【解决方案1】:

ceil(上限)函数:

import math
print(int(math.ceil(4.2)))

【讨论】:

  • 细化:math.ceil 返回大于或等于输入值的最小整数。此函数将输入视为浮点数(Python 没有强类型变量)并且函数返回一个浮点数。如果你想要一个int,你可以从返回值构造一个int,即int(math.ceil(363))
  • @Sinnet:实际上可以说python是强类型stackoverflow.com/a/11328980/5069869
  • @TheEspinosa:是的,python 绝对是类型的,只是很多函数会询问一些参数的类型并根据答案执行不同的代码。跨度>
  • @R.W.Sinnet 在 Python 3 中,math.ceil 返回一个实际的整数对象,而不仅仅是具有整数值的浮动对象。
  • 注意浮点精度,因为10000000 * 0.00136 = 13600.000000000002 ceil 可以增加很多math.ceil(10000000 * 0.00136) = 13601.0
【解决方案2】:

我知道这个答案是针对不久前的一个问题,但是如果您不想导入数学并且只想四舍五入,这对我有用。

>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5

如果有余数,则第一部分变为 4,第二部分计算结果为“True”,此外 True = 1; False = 0。因此,如果没有余数,则保持相同的整数,但如果有余数,则加 1。

【讨论】:

  • 不错。您也可以使用// 进行整数除法,这样就变成了21 // 5 + (21 % 5 > 0)
  • ...并将其作为一个不错的功能:def round_up(number): return int(number) + (number % 1 > 0)
【解决方案3】:

要记住的有趣的 Python 2.x 问题:

>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0

问题是在 python 中划分两个 int 会产生另一个 int 并且在上限调用之前被截断。您必须将一个值设为浮点数(或强制转换)才能获得正确的结果。

在 javascript 中,完全相同的代码会产生不同的结果:

console.log(Math.ceil(4500/1000));
5

【讨论】:

  • Python 2.x 中: int/int --> int and int/float --> float 在 Python 3 中。 x : int/int 可以产生浮点数
  • 您可以通过启用“真正的除法”来获得 Python 3.x 在某些版本的 Python 2.x 上的行为,如图所示here
【解决方案4】:

如果使用整数,向上舍入的一种方法是利用 // 向下舍入这一事实:只需对负数进行除法,然后否定答案。不需要导入、浮点或条件。

rounded_up = -(-numerator // denominator)

例如:

>>> print(-(-101 // 5))
21

【讨论】:

  • 当您不需要执行任何数学运算时怎么办? IE。你只有一个号码。
  • @Klik:那么你可以只除以 1 ==> -( -num // 1) 你得到你的答案:-)祝你有美好的一天! David Bau:非常好的提议!
  • 不错!我一直使用(num + den - 1) // den,这适用于具有正分母的int 输入,但即使涉及单个非整数float(分子或分母)也会失败;这看起来更神奇,但适用于ints 和floats。对于小分子,它也更快(在 CPython 3.7.2 上),但奇怪的是,当只有分子足够大以至于需要基于数组的数学时,你的方法会更慢;不清楚为什么会这样,因为除法工作应该相似,并且两个一元否定应该比加法 + 减法便宜。
  • 它不需要任何导入并且速度很快,这正是我想要的。
【解决方案5】:

你可能也喜欢 numpy:

>>> import numpy as np
>>> np.ceil(2.3)
3.0

我并不是说它比数学更好,但是如果您已经将 numpy 用于其他目的,您可以保持代码的一致性。

无论如何,只是我遇到的一个细节。我经常使用 numpy,但很惊讶它没有被提及,但当然接受的答案非常好。

【讨论】:

  • 使用 numpy 也不错。最简单的是数学,因为它已经是 python 内置库的一部分。这更有意义。相反,正如您提到的,如果您在其他问题上使用了很多 numpy,那么使用 numpy.ceil 是有意义且一致的 :-) 好提示!
  • 如果您使用 pandas 并将整个模块导入为 pd,则只需使用 pd.np.ceil(2.3)。不需要单独的 numpy 导入。
【解决方案6】:

Use math.ceil 总结:

>>> import math
>>> math.ceil(5.4)
6.0

注意:输入应该是浮点数。

如果需要整数,请调用int进行转换:

>>> int(math.ceil(5.4))
6

顺便说一句,使用math.floor 舍入,使用round 舍入到最接近的整数。

>>> math.floor(4.4), math.floor(4.5), math.floor(5.4), math.floor(5.5)
(4.0, 4.0, 5.0, 5.0)
>>> round(4.4), round(4.5), round(5.4), round(5.5)
(4.0, 5.0, 5.0, 6.0)
>>> math.ceil(4.4), math.ceil(4.5), math.ceil(5.4), math.ceil(5.5)
(5.0, 5.0, 6.0, 6.0)

【讨论】:

  • 如果使用python 3,输入不一定是浮点数:ceil()will take care of it内部
  • 请注意,在 python 3 中,round() 实际上会像docs 中描述的那样舍入一半,所以第二行将返回(4, 4, 5, 6)
【解决方案7】:

我很惊讶没有人建议

(numerator + denominator - 1) // denominator

用于整数除法和四舍五入。曾经是 C/C++/CUDA 的常用方式(参见divup

【讨论】:

  • 仅与静态类型语言相关。如果分母是浮点数,你就死定了。
  • 这也只有在分母为正的情况下才能始终如一地工作;如果分母为负数,则需要将1 相加而不是相减,或者在进行数学运算前翻转分子和分母的符号。
  • @Bharel 显然不是真的。 Python 有类型,你甚至可以检查它的值。此代码适用于 int。同样值得注意的是,即使对于大于 2^53 的整数,此代码也可以工作,在这种情况下,浮点运算可能无法产生正确的结果。
【解决方案8】:

语法可能不像人们想象的那样像pythonic,但它是一个强大的库。

https://docs.python.org/2/library/decimal.html

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))

【讨论】:

    【解决方案9】:

    对于那些想要将a / b四舍五入并获得整数的人:

    另一个使用整数除法的变体是

    def int_ceil(a, b):
        return (a - 1) // b + 1
    
    >>> int_ceil(19, 5)
    4
    >>> int_ceil(20, 5)
    4
    >>> int_ceil(21, 5)
    5
    

    注意:ab 必须是非负整数

    【讨论】:

    • int_ceil(-0.1, 1) 给出错误答案。当它是-1.0时应该是0.0
    • @ogogmad 只有当 a 和 b 是整数时才有意义。如果您有浮点数,请按照最佳答案的建议使用 math.ceil
    • int_ceil(2,-1) 给我0。所以整数必须是非负数
    • @ogogmad 我同意,在答案中添加注释,谢谢
    • @Pavel b 是正数还不够吗?
    【解决方案10】:

    试试这个:

    a = 211.0
    print(int(a) + ((int(a) - a) != 0))
    

    【讨论】:

    • 聪明。只要a 需要四舍五入,((int(a) - a) != 0) 表达式就会返回 1。您可能想扩展您的答案并解释其工作原理。
    • @TomAranda 谁能解释一下布尔表达式如何计算出一个值?
    【解决方案11】:

    确保舍入值应该是浮点数

    a = 8 
    b = 21
    print math.ceil(a / b)
    >>> 0
    

    但是

    print math.ceil(float(a) / b)
    >>> 1.0
    

    【讨论】:

      【解决方案12】:

      上面的答案是正确的,但是,只为这个功能导入math 模块对我来说通常感觉有点过头了。幸运的是,还有另一种方法:

      g = 7/5
      g = int(g) + (not g.is_integer())
      

      TrueFalse 在 python 中涉及数字的语句中被解释为 10g.is_interger() 基本上翻译成g.has_no_decimal()g == int(g)。所以英文的最后一条语句是round g down and add one if g has decimal

      【讨论】:

      • 如果你觉得花哨,你可以使用int(g) + (g % 1 > 0) ;-)
      • from math import ceil 似乎修复了导入整个数学模块 :)
      • @SH7890 就幕后发生的事情而言,恐怕这条线与import math 没有太大区别。它只会删除除ceil 之外的所有符号。
      【解决方案13】:

      不导入数学 // 使用基本环境:

      a) 方法/类方法

      def ceil(fl): 
        return int(fl) + (1 if fl-int(fl) else 0)
      
      def ceil(self, fl): 
        return int(fl) + (1 if fl-int(fl) else 0)
      

      b) λ:

      ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)
      

      【讨论】:

        【解决方案14】:

        如果有人希望四舍五入到特定的小数位:

        import math
        def round_up(n, decimals=0):
            multiplier = 10 ** decimals
            return math.ceil(n * multiplier) / multiplier
        

        【讨论】:

          【解决方案15】:
          >>> def roundup(number):
          ...     return round(number+.5)
          >>> roundup(2.3)
          3
          >>> roundup(19.00000000001)
          20
          

          这个函数不需要模块。

          【讨论】:

          • 如果你的号码是3,那么它会四舍五入到4,这可能是也可能不是某人想要的
          【解决方案16】:

          x * -1 // 1 * -1

          令人困惑,但它有效:对于x=7.1,你会得到8.0。对于x = -1.1,你会得到-1.0

          无需导入模块。

          【讨论】:

            【解决方案17】:

            如果你不想导入任何东西,你总是可以编写自己的简单函数为:

            def RoundUP(num):
                if num== int(num):
                    return num
                return int(num + 1)
            

            【讨论】:

            • 如果 num 为 2.05,这将不起作用。您必须至少有与您的输入一样多的数字 9,留下 0.999... 即 1。但随后您的极端情况 2 又被四舍五入了。 -- 好吧,我想 math.ceil 的存在是有原因的。
            【解决方案18】:

            对于那些不想使用导入的人。

            对于给定的列表或任何数字:

            x = [2, 2.1, 2.5, 3, 3.1, 3.5, 2.499,2.4999999999, 3.4999999,3.99999999999]
            

            您必须首先评估该数字是否等于其整数,该整数始终向下取整。如果结果为True,则返回数字,如果不是,则返回整数(数字)+ 1。

            w = lambda x: x if x == int(x) else int(x)+1
            [w(i) for i in z]
            >>> [2, 3, 3, 3, 4, 4, 3, 3, 4, 4]
            

            数学逻辑:

            • 如果数字有小数部分:round_up - round_down == 1,总是。
            • 如果数字没有小数部分:round_up - round_down == 0。

            所以:

            • round_up == x + round_down

            与:

            • x == 1 if number != round_down
            • x == 0 如果数字 == round_down

            您将数字分成两部分,整数和小数。如果小数不为 0,则加 1。

            PS:我详细解释了这一点,因为上面有一些cmets要求这样做,而我在这里仍然是菜鸟,所以我无法发表评论。

            【讨论】:

              【解决方案19】:

              你可以像这样使用圆形:

              cost_per_person = round(150 / 2, 2)
              
                
              

              【讨论】:

              • 这应该在 round() 的第二个参数为零时起作用。即round(x/y,0)
              【解决方案20】:

              无需任何导入即可:

              >>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
              >>> round_up(2.0)
              2
              >>> round_up(2.1)
              3
              

              【讨论】:

                【解决方案21】:

                我知道这是很久以前的事了,但我找到了一个非常有趣的答案,所以这里是:

                -round(-x-0.5)
                

                这修复了边缘情况并适用于正数和负数,并且不需要任何函数导入

                干杯

                【讨论】:

                • 这仍然会向下取整 -round(-x-0.3) = x
                • 还会错误地递增精确数字。例如,-round(-3-0.5) 应该返回 4 而不是 3。
                【解决方案22】:

                我很惊讶我还没有看到这个答案round(x + 0.4999),所以我要把它记下来。请注意,这适用于任何 Python 版本。对 Python 舍入方案所做的更改使事情变得困难。看到这个post

                不导入,我使用:

                def roundUp(num):
                    return round(num + 0.49)
                
                testCases = list(x*0.1 for x in range(0, 50))
                
                print(testCases)
                for test in testCases:
                    print("{:5.2f}  -> {:5.2f}".format(test, roundUp(test)))
                

                为什么会这样

                来自文档

                对于支持 round() 的内置类型,值会四舍五入到最接近的 10 次幂减去 n 的倍数;如果两个倍数相等,则向偶数选择舍入

                因此,2.5 舍入为 2,3.5 舍入为 4。如果不是这种情况,则可以通过添加 0.5 进行舍入,但我们希望避免到达中间点。因此,如果您添加 0.4999,您将接近,但有足够的余量可以四舍五入到您通常期望的值。当然,如果x + 0.4999 等于[n].5000,这将失败,但这不太可能。

                【讨论】:

                • 使用 0.4999,对于介于 ???.0000 和 ???.0001(开区间)之间的任何输入,它将无法给出正确的结果,而不仅仅是 ???.0001。例如,如果您尝试使用 3.00005,您将得到 3 而不是预期的 4。当然,您可以通过将越来越多的数字添加到浮点数的最大精度来降低发生这种情况的可能性,但是什么是指出如果手头有更强大和直观的解决方案,比如使用math.ceil()
                • @blubberdiblub 在我的回答中,我声明了Without importing I use:。我还提到如果x + 0.4999 等于[n].5000,它将失败。
                • 是的,您在回答中声明您的解决方案没有导入,但我看不出它的价值。 math 模块和 math.ceil() 位于标准库中,因此无需安装额外的东西即可用于所有实际用途。关于你提到它何时失败,这在你的回答中是不完整的,因为它在整个间隔内都失败了,而不仅仅是一个点。从技术上讲,您可能会争辩说您是正确的,正如您所说的 if 而不是 iff,但它会给普通读者留下这样的印象,即它的可能性比实际情况要小.
                【解决方案23】:

                您可以使用楼层除法并将其加 1。 2.3 // 2 + 1

                【讨论】:

                • 或使用ceil(),而不是奇怪地反其道而行之,然后进行补偿
                • 这行不通。例如:from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
                【解决方案24】:

                当您在 python 中操作 4500/1000 时,结果将为 4,因为对于默认 python 假定结果为整数,逻辑上: 4500/1000 = 4.5 --> int(4.5) = 4 4 的 ceil 显然是 4

                使用 4500/1000.0 结果将是 4.5 和 4.5 的 ceil --> 5

                使用 javascript 您将收到 4.5 作为 4500/1000 的结果,因为 javascript 仅假定结果为“数字类型”并直接以浮点形式返回结果

                祝你好运!!

                【讨论】:

                • 这仅在 Python 2.x 中是正确的。在 Python 3 中,使用单个 / 进行除法始终会产生浮点数,因此 4500/1000 始终为 4.5。
                【解决方案25】:

                我认为您混淆了int()round() 之间的工作机制。

                int() 在给出浮点数时总是截断十进制数;而round(),在2.5 的情况下,其中23 都在与2.5 相等的距离内,Python 返回距离0 点更远的那个。

                round(2.5) = 3
                int(2.5) = 2
                

                【讨论】:

                • “四舍五入”意味着例如2.3 变成 3,这在您的两个示例中都没有发生。
                【解决方案26】:

                我的分享

                我已经测试了print(-(-101 // 5)) = 21 上面给出的例子。

                现在进行四舍五入:

                101 * 19% = 19.19
                

                我不能使用**,所以我将乘法扩展到除法:

                (-(-101 //(1/0.19))) = 20
                

                【讨论】:

                • 请解释一下您要做什么?
                【解决方案27】:

                我基本上是 Python 的初学者,但如果你只是想向上取整而不是向下取整,为什么不这样做:

                round(integer) + 1
                

                【讨论】:

                • 这不适用于 2.5
                • 我想你的意思是round(integer + 0.5)这是我经常做的事情
                猜你喜欢
                • 1970-01-01
                • 2015-11-12
                • 2023-01-12
                • 1970-01-01
                • 2018-08-03
                • 1970-01-01
                • 2022-11-21
                • 2023-03-30
                • 1970-01-01
                相关资源
                最近更新 更多