Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

round down to nearest number

92 views
Skip to first unread message

noydb

unread,
Feb 9, 2012, 7:30:53 PM2/9/12
to
How do you round down ALWAYS to nearest 100? Like, if I have number
3268, I want that rounded down to 3200. I'm doing my rounding like
>>> round(3268, -2)
But, how to round DOWN?

Ian Kelly

unread,
Feb 9, 2012, 7:47:09 PM2/9/12
to noydb, pytho...@python.org
>>> 3268 // 100 * 100
3200

For more complicated cases, Decimal objects allow you to specify
alternate rounding modes.

noydb

unread,
Feb 9, 2012, 8:23:46 PM2/9/12
to
hmmm, okay.

So how would you round UP always? Say the number is 3219, so you want
3300 returned.

Chris Rebert

unread,
Feb 9, 2012, 8:43:58 PM2/9/12
to noydb, pytho...@python.org
http://stackoverflow.com/questions/17944/how-to-round-up-the-result-of-integer-division/96921

Thus: (3219 + 99) // 100

Slight tangent: Beware negative numbers when using // or %.

Cheers,
Chris

Ian Kelly

unread,
Feb 9, 2012, 9:00:37 PM2/9/12
to Chris Rebert, pytho...@python.org, noydb
On Thu, Feb 9, 2012 at 6:43 PM, Chris Rebert <cl...@rebertia.com> wrote:
> On Thu, Feb 9, 2012 at 5:23 PM, noydb <jenn....@gmail.com> wrote:
> http://stackoverflow.com/questions/17944/how-to-round-up-the-result-of-integer-division/96921
>
> Thus: (3219 + 99) // 100
>
> Slight tangent: Beware negative numbers when using // or %.

There's no problem with negative numbers here, as long as you actually
want to round *up* or *down*, as opposed to away from zero or toward
zero.

noydb

unread,
Feb 9, 2012, 9:25:56 PM2/9/12
to
That {>>> (3219 + 99) // 100} doesnt work if the number is other then
4 digits.


(for rounding up to nearest 100):
>>> (3219 + 99)//100
33
>>> (3289 + 99)//100
33
>>> (328678 + 99)//100
3287
>>> (328 + 99)//100
4

Terry Reedy

unread,
Feb 9, 2012, 10:29:05 PM2/9/12
to pytho...@python.org
On 2/9/2012 8:23 PM, noydb wrote:
> So how would you round UP always? Say the number is 3219, so you want
>>> (3333//100+1)*100
3400

--
Terry Jan Reedy

MRAB

unread,
Feb 9, 2012, 10:36:11 PM2/9/12
to pytho...@python.org
>>> (3219 + 99) // 100 * 100
3300
>>> (3289 + 99) // 100 * 100
3300
>>> (328678 + 99) // 100 * 100
328700
>>> (328 + 99) // 100 * 100
400

Those are all rounded up to the nearest 100 correctly.

MRAB

unread,
Feb 9, 2012, 10:39:08 PM2/9/12
to pytho...@python.org
On 10/02/2012 03:29, Terry Reedy wrote:
> On 2/9/2012 8:23 PM, noydb wrote:
>> So how would you round UP always? Say the number is 3219, so you want
> >>> (3333//100+1)*100
> 3400
>
Doing it that way doesn't always work. For example:

>>> (3400 // 100 + 1) * 100
3500

However:

>>> (3400 + 99) // 100 * 100
3400

Ian Kelly

unread,
Feb 10, 2012, 1:21:31 AM2/10/12
to pytho...@python.org
On Thu, Feb 9, 2012 at 8:36 PM, MRAB <pyt...@mrabarnett.plus.com> wrote:
> On 10/02/2012 02:25, noydb wrote:
>>
>>>> (3219 + 99) // 100 * 100
> 3300
>>>> (3289 + 99) // 100 * 100
> 3300
>>>> (328678 + 99) // 100 * 100
> 328700
>>>> (328 + 99) // 100 * 100
> 400
>
> Those are all rounded up to the nearest 100 correctly.

One thing to be aware of though is that while the "round down" formula
works interchangeably for ints and floats, the "round up" formula does
not.

>>> (3300.5 + 99) // 100 * 100
3300.0

A more consistent alternative is to negate the number, round down, and
then negate again.

>>> -(-(3300.5) // 100 * 100)
3400.0

Cheers,
Ian

Arnaud Delobelle

unread,
Feb 10, 2012, 4:58:35 AM2/10/12
to Ian Kelly, pytho...@python.org
On 10 February 2012 06:21, Ian Kelly <ian.g...@gmail.com> wrote:
>>>>> (3219 + 99) // 100 * 100
>> 3300
>>>>> (3289 + 99) // 100 * 100
>> 3300
>>>>> (328678 + 99) // 100 * 100
>> 328700
>>>>> (328 + 99) // 100 * 100
>> 400
>>
>> Those are all rounded up to the nearest 100 correctly.
>
> One thing to be aware of though is that while the "round down" formula
> works interchangeably for ints and floats, the "round up" formula does
> not.
>
>>>> (3300.5 + 99) // 100 * 100
> 3300.0
>

I'm surprised I haven't seen:

>>> 212 - (212 % -100)
300

Here's a function that:
* rounds up and down
* works for both integers and floats
* is only two operations (as opposed to 3 in the solutions given above)

>>> def round(n, k):
... return n - n%k
...
>>> # Round down with a positive k:
... round(167, 100)
100
>>> round(-233, 100
... )
-300
>>> # Round up with a negative k:
... round(167, -100)
200
>>> round(-233, -100)
-200
>>> # Edge cases
... round(500, -100)
500
>>> round(500, 100)
500
>>> # Floats
... round(100.5, -100)
200.0
>>> round(199.5, 100)
100.0

--
Arnaud

Alec Taylor

unread,
Feb 10, 2012, 6:05:39 AM2/10/12
to Arnaud Delobelle, pytho...@python.org

noydb

unread,
Feb 10, 2012, 12:23:21 PM2/10/12
to
On Feb 10, 4:58 am, Arnaud Delobelle <arno...@gmail.com> wrote:
> Arnaud- Hide quoted text -
>
> - Show quoted text -

Thanks! Covers all bases, good.

Olive

unread,
Feb 10, 2012, 3:56:44 PM2/10/12
to
This trick work always (even if the entry is a float):


-(-a//100)*100

>>> -(-3219//100)*100
3300

>>> -(-3200.1//100)*100

3300.0

Hrvoje Niksic

unread,
Feb 11, 2012, 5:26:08 AM2/11/12
to
Terry Reedy <tjr...@udel.edu> writes:

> On 2/9/2012 8:23 PM, noydb wrote:
>> So how would you round UP always? Say the number is 3219, so you want
>>>> (3333//100+1)*100
> 3400

Note that that doesn't work for numbers that are already round:

>>> (3300//100+1)*100
3400 # 3300 would be correct

I'd go with Chris Rebert's (x + 99) // 100.
0 new messages