toogy - 21 days ago 5

Python Question

I would like to design a function

`f(x : float, up : bool)`

`# 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`

`142.449`

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