Answers:
该小区(上限)功能:
import math
print(math.ceil(4.2))
int(math.ceil(363))
math.ceil
返回一个实际的整数对象,而不仅仅是具有整数值的浮动对象。
10000000 * 0.00136 = 13600.000000000002
ceil可能会增加很多math.ceil(10000000 * 0.00136) = 13601.0
我知道这个答案是一个很久以前的问题,但是如果您不想导入数学并且只想四舍五入,那么这对我有用。
>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
如果有余数,则第一部分将变为4,第二部分将得出“ True”,另外,True = 1; False =0。因此,如果没有余数,则它将保持相同的整数,但是如果有余数,则将其加1。
//
整数除法,因此变为21 // 5 + (21 % 5 > 0)
。
float
的。真好
请记住有趣的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
如果使用整数,则四舍五入的一种方法是利用四舍五入的事实//
:只需对负数进行除法,然后取反即可。无需导入,浮点或有条件的。
rounded_up = -(-numerator // denominator)
例如:
>>> print(-(-101 // 5))
21
(num + den - 1) // den
,这对于int
带有正分母的输入很好,但是即使涉及单个非整数float
(分子或分母),也会失败。这看起来更神奇,但同时适用于int
和float
。对于较小的分子,它也更快(在CPython 3.7.2上),但是奇怪的是,当仅分子大到足以需要基于数组的数学运算时,您的方法就更慢了。不清楚为什么会这样,因为除法运算应该相似,并且两个一元否定应该比加减法便宜。
您可能还喜欢numpy:
>>> import numpy as np
>>> np.ceil(2.3)
3.0
我并不是说它比数学更好,但是如果您已经将numpy用于其他目的,则可以使代码保持一致。
无论如何,我遇到的只是一个细节。我经常使用numpy,但感到惊讶的是它没有被提及,但是当然可以接受。
使用math.ceil
围捕:
>>> import math
>>> math.ceil(5.4)
6.0
注意:输入应为浮点型。
如果需要整数,请调用int
将其转换:
>>> int(math.ceil(5.4))
6
BTW,使用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)
语法可能不像pythonic那样,但是它是一个功能强大的库。
https://docs.python.org/2/library/decimal.html
from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
我很惊讶没有人建议
(numerator + denominator - 1) // denominator
用于四舍五入的整数除法。曾经是C / C ++ / CUDA的常用方法(参见divup
)
1
而不是减,或者在执行数学运算之前翻转分子和分母的正负号。
>>> def roundup(number):
... return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20
此功能不需要任何模块。
3
,那么它将舍入4
为某人想要或可能不是的东西
上面的答案是正确的,但是,math
对于这个功能而言,导入模块通常对我来说有点过头了。幸运的是,还有另一种方法可以做到:
g = 7/5
g = int(g) + (not g.is_integer())
True
并且在python中涉及数字的语句中False
被解释为1
和0
。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)
改用;-)
from math import ceil
似乎修复了导入整个数学模块的问题:)
import math
与幕后发生的事情并没有太大不同。它只会删除除以外的所有符号ceil
。
令我惊讶的是我还没有看到这个答案round(x + 0.4999)
,所以我要把它放下来。请注意,这适用于任何Python版本。对Python舍入方案的更改使事情变得困难。看到这篇文章。
不导入,我使用:
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()的内置类型,将值四舍五入为乘幂n的最接近10的倍数;如果两个倍数相等接近,则四舍五入取整为偶数选择
因此,将2.5舍入为2,将3.5舍入为4。如果不是这种情况,则可以通过加0.5来舍入,但是我们要避免到达中间点。因此,如果添加0.4999,您将接近,但有足够的余量可以四舍五入到通常的期望值。当然,如果x + 0.4999
等于,这将失败[n].5000
,但这不太可能。
math.ceil()
?
Without importing I use:
。我还提到过,如果x + 0.4999
等于,它将失败[n].5000
。
math
模块math.ceil()
位于标准库中,因此可在所有实际应用中随处使用,而无需安装其他东西。关于您提到何时失败,这在您的答案中是不完整的,因为它会在整个时间间隔内失败,而不仅仅是在单个点上失败。从技术上讲,您可以说您是正确的,就像您说的是if而不是iff一样,但这会让随便的读者觉得它的可能性比实际的可能性小。
如果您不想导入任何内容,则可以始终将自己的简单函数编写为:
def RoundUP(num):
if num== int(num):
return num
return int(num + 1)
您可以使用楼层划分并将其添加1。2.3 // 2 + 1
ceil()
而不是奇怪地做相反的事情然后补偿
from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
round(number + .5)
如果数字是整数,则不起作用。round(3+.5) == 4
当你真正想要的时候3
。