base: float rounding and ceiling

Commit d4972ff was reverted at 333852e due to remaining issue with negative values.

In float_round, the epsilon was applied with
   normalized_value -= cmp(normalized_value,0) * epsilon
which would transform -6.0 into -5.99999, which becomes -5.0 after math.ceil()
For UP rounding method, unlike HALF-UP, the epislon should always be substracted whatever the sign of normalized value.
Added test to make sure that -6.0 stays -6.0.

Fixes #1125 #2793