How do you round UP a number in Python?

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

This problem is killing me. How does one roundup a number UP in Python?

I tried round(number) but it round the number down. Example:

round(2.3) = 2.0 and not 3, what I would like 

The I tried int(number + .5) but it round the number down again! Example:

int(2.3 + .5) = 2 

Then I tried round(number + .5) but it won't work in edge cases. Example:

WAIT! THIS WORKED! 

Please advise.

回答1:

The ceil (ceiling) function:

import math print(math.ceil(4.2)) 


回答2:

Interesting Python 2.x issue to keep in mind:

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

The problem is that dividing two ints in python produces another int and that's truncated before the ceiling call. You have to make one value a float (or cast) to get a correct result.

In javascript, the exact same code produces a different result:

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


回答3:

I know this answer is for a question from a while back, but if you don't want to import math and you just want to round up, this works for me.

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

The first part becomes 4 and the second part evaluates to "True" if there is a remainder, which in addition True = 1; False = 0. So if there is no remainder, then it stays the same integer, but if there is a remainder it adds 1.



回答4:

You might also like numpy:

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

I'm not saying it's better than math, but if you were already using numpy for other purposes, you can keep your code consistent.

Anyway, just a detail I came across. I use numpy a lot and was surprised it didn't get mentioned, but of course the accepted answer works perfectly fine.



回答5:

If working with integers, one way of rounding up is to take advantage of the fact that // rounds down: Just do the division on the negative number, then negate the answer. No import, floating point, or conditional needed.

rounded_up = -(-numerator // denominator) 

For example:

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


回答6:

Use math.ceil to round up:

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

NOTE: The input should be float.

If you need an integer, call int to convert it:

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

BTW, use math.floor to round down and round to round to nearest integer.

>>> 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) 


回答7:

The syntax may not be as pythonic as one might like, but it is a powerful library.

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

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


回答8:

Be shure rounded value should be float

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

but

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


回答9:

I am surprised nobody suggested

(numerator + denominator - 1) // denominator 

for integer division with rounding up. Used to be the common way for C/C++/CUDA (cf. divup)



回答10:

I'm surprised I haven't seen this answer yet round(x + 0.4999), so I'm going to put it down. Note that this works with any Python version. Changes made to the Python rounding scheme has made things difficult. See this post.

Without importing, I use:

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))) 

Why this works

From the docs

For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus n; if two multiples are equally close, rounding is done toward the even choice

Therefore 2.5 gets rounded to 2 and 3.5 gets rounded to 4. If this was not the case then rounding up could be done by adding 0.5, but we want to avoid getting to the halfway point. So, if you add 0.4999 you will get close, but with enough margin to be rounded to what you would normally expect. Of course, this will fail if the x + 0.4999 is equal to [n].5000, but that is unlikely.



回答11:

The above answers are correct, however, importing the math module just for this one function usually feels like a bit of an overkill for me. Luckily, there is another way to do it:

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

True and False are interpreted as 1 and 0 in a statement involving numbers in python. g.is_interger() basically translates to g.has_no_decimal() or g == int(g). So the last statement in English reads round g down and add one if g has decimal.



回答12:

Without importing math // using basic envionment:

a) method / class method

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) lambda:

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


回答13:

Try this:

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


回答14:

when you operate 4500/1000 in python, result will be 4, because for default python asume as integer the result, logically: 4500/1000 = 4.5 --> int(4.5) = 4 and ceil of 4 obviouslly is 4

using 4500/1000.0 the result will be 4.5 and ceil of 4.5 --> 5

Using javascript you will recieve 4.5 as result of 4500/1000, because javascript asume only the result as "numeric type" and return a result directly as float

Good Luck!!



回答15:

For those who want to round up a / b and get integer:

Another variant using integer division is

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 


回答16:

To do it without any import:

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


回答17:

I know this is from quite a while back, but I found a quite interesting answer, so here goes:

-round(-x-0.5) 

This fixes the edges cases and works for both positive and negative numbers, and doesn't require any function import

Cheers



回答18:

You can use floor devision and add 1 to it. 2.3 // 2 + 1



回答19:

If you don't want to import anything, you can always write your own simple function as:

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



回答20:

I think you are confusing the working mechanisms between int() and round().

int() always truncates the decimal numbers if a floating number is given; whereas round(), in case of 2.5 where 2 and 3 are both within equal distance from 2.5, Python returns whichever that is more away from the 0 point.

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


回答21:

I'm basically a beginner at Python, but if you're just trying to round up instead of down why not do:

round(integer) + 1 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!