你如何在Python中舍入一个数字?

bod*_*ydo 439 python floating-point integer rounding python-2.x

这个问题让我很难过.如何在Python中对数字进行综合?

我尝试了一些(数字),但它将数字向下舍入.例:

round(2.3) = 2.0 and not 3, what I would like
Run Code Online (Sandbox Code Playgroud)

我尝试了int(数字+ .5),但它再次将数字向下舍入!例:

int(2.3 + .5) = 2
Run Code Online (Sandbox Code Playgroud)

然后我尝试了一下(数字+ .5)但它在边缘情况下不起作用.例:

WAIT! THIS WORKED!
Run Code Online (Sandbox Code Playgroud)

请指教.

Ste*_*joa 782

小区(上限)功能:

import math
print(math.ceil(4.2))
Run Code Online (Sandbox Code Playgroud)

  • 详细说明:math.ceil返回大于或等于输入值的最小整数.此函数将输入视为float(Python没有强类型变量),函数返回float.如果你想要一个int,你可以从返回值构造一个int,即`int(math.ceil(363))` (16认同)
  • @Sinnet:实际上可以说python是强类型的http://stackoverflow.com/a/11328980/5069869 (9认同)
  • @RWSinnet在Python 3中,`math.ceil`返回一个实际的整数对象,而不仅仅是带有整数值的浮动对象. (7认同)
  • @TheEspinosa:是的,python 绝对是 **强** 类型的,只是许多函数会询问有关某些参数类型的问题,并根据答案执行不同的代码。 (2认同)
  • 注意浮点精度,因为 ``10000000 * 0.00136 = 13600.000000000002`` ceil 可以增加很多``math.ceil(10000000 * 0.00136) = 13601.0`` (2认同)
  • @Ender“函数输出一个浮点数”是不正确的,除非在古老的、不再受支持的Python版本中。在 Python 3 中,“math.ceil”返回一个“int”。 (2认同)

Tro*_*eek 154

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

>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0
Run Code Online (Sandbox Code Playgroud)

问题是在python中划分两个int会产生另一个int,并且在天花板调用之前会被截断.您必须使一个值成为浮点(或强制转换)以获得正确的结果.

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

console.log(Math.ceil(4500/1000));
5
Run Code Online (Sandbox Code Playgroud)

  • 在**Python 2.x**:int/int - > int _and_ int/float - > float In**Python 3.x**:int/int可以导致浮动 (44认同)
  • 您可以通过启用"true division"来获取Python 3.x在某些版本的Python 2.x上的行为,如[here]所示(http://stackoverflow.com/a/1267892/171094) (7认同)

use*_*620 151

我知道这个答案是针对前一个问题的答案,但是如果你不想导入数学而你只想整理一下,这对我有用.

>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
Run Code Online (Sandbox Code Playgroud)

如果有余数,第一部分变为4,第二部分评估为"真",此外True = 1; False = 0.因此,如果没有余数,则它保持相同的整数,但如果有余数则加1.

  • 尼斯.你也可以使用`//`进行整数除法,这样就变成了`21 // 5 +(21%5> 0)`. (32认同)
  • ...并将其作为一个不错的函数: def round_up(number): return int(number) + (number % 1 > 0) (4认同)
  • 如果仅涉及整数,则这是最佳解决方案。没有不必要的`float`s。真好 (3认同)

Dav*_*Bau 94

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

rounded_up = -(-numerator // denominator)
Run Code Online (Sandbox Code Playgroud)

例如:

>>> print(-(-101 // 5))
21
Run Code Online (Sandbox Code Playgroud)

  • 我在这里计算了所有的答案,这比下一个最好的(math.ceil)快了五倍.@Andreas也有同一时间 (9认同)
  • 当您不需要执行任何数学运算时怎么办?即你只有一个号码。 (2认同)
  • @Klik:然后你可以除以1 ==> - (-num // 1)并得到你的答案:-)祝你愉快!David Bau:非常好的建议! (2认同)
  • 好的!我一直使用 `(num + den - 1) // den`,这对于具有正分母的 `int` 输入很好,但如果涉及单个非整数 `float` (分子或分母),就会失败; 这看起来更神奇,但适用于“int”和“float”。对于小分子,它也更快(在 CPython 3.7.2 上),但奇怪的是,当只有分子足够大以至于需要基于数组的数学时,您的方法会更慢;不清楚为什么会这样,因为除法工作应该是类似的,并且两个一元否定应该比加法+减法便宜。 (2认同)
  • 事实上,它不需要任何导入并且速度很快,这正是我所寻找的。 (2认同)

Lis*_*isa 52

你可能也喜欢numpy:

>>> import numpy as np
>>> np.ceil(2.3)
3.0
Run Code Online (Sandbox Code Playgroud)

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

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

  • 使用numpy也很好.最简单的是数学,因为它已经是库中构建的python的一部分.这更有意义.相反,正如你提到的,如果你对其他问题使用了很多numpy,那么使用numpy.ceil是有意义和一致的:-)好提示! (3认同)

ken*_*ytm 28

用于math.ceil向上舍入:

>>> import math
>>> math.ceil(5.4)
6.0
Run Code Online (Sandbox Code Playgroud)

注意:输入应该是浮动的.

如果你需要一个整数,请调用int它来转换它:

>>> int(math.ceil(5.4))
6
Run Code Online (Sandbox Code Playgroud)

顺便说一句,用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)
Run Code Online (Sandbox Code Playgroud)

  • 如果使用 python 3,输入不一定需要是浮点数:`ceil()` [将处理它](https://docs.python.org/3.6/library/math.html#math.ceil)内部 (2认同)

rhu*_*123 18

modulo这是一种使用和的方法bool

n = 2.3
int(n) + bool(n%1)
Run Code Online (Sandbox Code Playgroud)

输出:

3
Run Code Online (Sandbox Code Playgroud)

  • 因不需要导入而投票 (3认同)

Nuc*_*eon 12

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

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

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
Run Code Online (Sandbox Code Playgroud)


小智 11

我没有人建议我感到惊讶

(numerator + denominator - 1) // denominator
Run Code Online (Sandbox Code Playgroud)

用于舍入的整数除法.曾经是C/C++/CUDA的常用方法(参见divup)

  • @Bharel 显然不是真的。Python 有类型,您甚至可以检查它的值。这段代码对于 int 来说可以正常工作。还值得注意的是,该代码甚至适用于大于 2^53 的整数,在这种情况下,浮点运算可能无法产生正确的结果。 (3认同)
  • 仅与静态类型的语言有关。如果分母是浮点数,那么您就死定了。 (2认同)
  • 这也只有在分母为正时才一致有效;如果分母为负数,则需要加“1”而不是减去它,或者在执行数学之前翻转分子和分母的符号。 (2认同)

Pav*_*vel 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
Run Code Online (Sandbox Code Playgroud)

注意:aandb必须是非负整数


Ale*_*xey 7

要保持圆润的价值应该浮动

a = 8 
b = 21
print math.ceil(a / b)
>>> 0
Run Code Online (Sandbox Code Playgroud)

print math.ceil(float(a) / b)
>>> 1.0
Run Code Online (Sandbox Code Playgroud)


小智 6

试试这个:

a = 211.0
print(int(a) + ((int(a) - a) != 0))
Run Code Online (Sandbox Code Playgroud)

  • 聪明的。`((int(a) - a) != 0)` 表达式在需要对 `a` 进行四舍五入时返回 `1`。您可能想要扩展您的答案并解释它是如何工作的。 (2认同)

Pon*_*asM 6

>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20
Run Code Online (Sandbox Code Playgroud)

此功能不需要模块.

  • 这仅适用于所有情况的99%。您没有正确地考虑到这一点。应不惜一切代价避免这种解决方案。 (10认同)
  • 如果您的号码是“3”,那么它会四舍五入为“4”,这可能是也可能不是某人想要的 (5认同)

jka*_*brg 6

x * -1 // 1 * -1

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

无需导入模块。

  • x * -1 // 1 * -1 = -(-x // 1)。// 运算符总是向下舍入,因此 x // 1 = Floor(x)。因此,这里的逻辑是将被求反的数字向下舍入,然后再次求反,从而导致原始数字向上舍入。 (2认同)

Nea*_*roo 5

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

g = 7/5
g = int(g) + (not g.is_integer())
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你觉得很花哨,你可以使用 `int(g) + (g % 1 > 0)` 代替 ;-) (2认同)

小智 5

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

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)
Run Code Online (Sandbox Code Playgroud)

b)lambda:

ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)
Run Code Online (Sandbox Code Playgroud)


osu*_*ess 5

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

import math
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
Run Code Online (Sandbox Code Playgroud)