toogy toogy - 21 days ago 5
Python Question

round up/down float to 2 decimals

I would like to design a function

f(x : float, up : bool)
with these input/output:

# 2 decimals part rounded up (up = True)
f(142.452, True) = 142.46
f(142.449, True) = 142.45
# 2 decimals part rounded down (up = False)
f(142.452, False) = 142.45
f(142.449, False) = 142.44


Now, I know about Python's
round
built-in function but it will always round
142.449
up, which is not what I want.

Is there a way to do this in a nicer pythonic way than to do a bunch of float comparisons with epsilons (prone to errors)?

Answer

Have you considered a mathematical approach using floor and ceil?

If you always want to round to 2 digits, then you could premultiply the number to be rounded by 100, then perform the rounding to the nearest integer and then divide again by 100.

from math import floor, ceil

def rounder(num, up=True):
    digits = 2
    mul = 10**digits
    if up:
        return ceil(num * mul)/mul
    else:
        return floor(num*mul)/mul