我尝试使用round(number)函数,但它会将数字向下取整。以下是一个示例:
round(2.3) = 2.0
而不是 3,这正是我想要的。
然后我尝试了int(number + .5)
,但它再次将数字舍入到下一个整数!例如:
int(2.3 + .5) = 2
round(2.3) = 2.0
而不是 3,这正是我想要的。
然后我尝试了int(number + .5)
,但它再次将数字舍入到下一个整数!例如:
int(2.3 + .5) = 2
math.ceil(天花板)函数返回不小于x
的最小整数。
对于 Python 3:
import math
print(math.ceil(4.2))
对于 Python 2:
import math
print(int(math.ceil(4.2)))
int(math.ceil(363))
。 - R. W. Sinnetmath.ceil
返回一个实际的整数对象,而不仅仅是具有整数值的浮点对象。 - Arthur Taccamath.ceil
返回一个 int
。 - Mark Dickinson我知道这个答案是针对之前的一个问题,但如果你不想导入math模块,只想要向上取整,这个方法对我有效。
>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
如果有余数,第一部分变成了4并且第二部分计算为 "True";此外,True = 1; False = 0。因此,如果没有余数,则它保持相同的整数,但如果有余数,则会加上1。
//
进行整数除法,因此这个表达式可以写成 21 // 5 + (21 % 5 > 0)
。 - naught101divmod
函数:d, m = divmod(number) return int(d) + m > 0
- VMAtm如果使用整数,将数字向上舍入的一种方法是利用 //
向下取整的特性:只需在负数上进行除法运算,然后取反答案即可。不需要导入模块、浮点数或条件语句。
rounded_up = -(-numerator // denominator)
例如:>>> print(-(-101 // 5))
21
(num + den - 1) // den
,对于正分母的int
输入来说是可以的,但如果涉及到单个非整数float
(无论是分子还是分母),它就会失败;这种方法看起来更神奇,但适用于int
和float
。对于小的分子,它也更快(在CPython 3.7.2上),尽管奇怪的是,当只有分子足够大以至于需要基于数组的数学运算时,你的方法反而更慢;不清楚为什么,因为除法工作应该是相似的,两个一元否定应该比加法+减法更便宜。 - ShadowRanger需要记住的有趣的Python 2.x问题:
>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0
问题是在 Python 中两个整数相除会产生另一个整数,而且在向上取整之前该值已经被截断。你需要将其中一个值转换成浮点数(或进行强制类型转换)才能得到正确的结果。
在 JavaScript 中,完全相同的代码会产生不同的结果:
console.log(Math.ceil(4500/1000));
5
您可能也会喜欢NumPy:
>>> import numpy as np
>>> np.ceil(2.3)
3.0
我并不是说这比数学更好,但如果你已经在其他方面使用numpy,你可以保持代码的一致性。
无论如何,这只是一个我偶然发现的细节。我经常使用numpy,所以很惊讶它没有被提到,但当然被接受的答案完全可以胜任。
>>> 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)
我很惊讶没有人提出建议
(numerator + denominator - 1) // denominator
用于整数向上取整的除法。这曾经是C/C++/CUDA常用的方法(参见divup
)。
1
而不是减去它,或在执行计算之前翻转分子和分母的符号。 - ShadowRanger这里有一种使用取模
和布尔值
的方法。
n = 2.3
int(n) + bool(n%1)
输出:
3
对于那些想要将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
注意: a
和 b
必须是非负整数。
int_ceil(-0.1, 1)
给出了错误的答案。当它是 -1.0
时,应该是 0.0
。 - wladint_ceil(2,-1)
对我来说返回 0
。因此整数必须是非负的。 - wlad虽然语法可能不像人们所希望的那样pythonic,但它是一个功能强大的库。
https://docs.python.org/2/library/decimal.html
from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
round(number + .5)
就不起作用。例如round(3+.5) == 4
,但你实际上想要的是3
。请使用其他方法来实现四舍五入功能。 - Nearoo