# Rounding a number to nearest even

hdante hdante at gmail.com
Fri Apr 11 15:49:23 CEST 2008

```On Apr 11, 9:45 am, bdsatish <bdsat... at gmail.com> wrote:
> On Apr 11, 5:33 pm, bdsatish <bdsat... at gmail.com> wrote:
>
>
>
> > HI Gerard,
>
> > I think you've taken it to the best possible implementation. Thanks !
> > On Apr 11, 5:14 pm, Gerard Flanagan <grflana... at gmail.com> wrote:
>
> > > In fact you can avoid the call to the builtin round:
>
> > > ------------------------------------------------
>
> > > assert myround(3.2) == 3
> > > assert myround(3.6) == 4
> > > assert myround(3.5) == 4
> > > assert myround(2.5) == 2
> > > assert myround(-0.5) == 0.0
> > > assert myround(-1.5) == -2.0
> > > assert myround(-1.3) == -1.0
> > > assert myround(-1.8) == -2
> > > assert myround(-2.5) ==  -2.0
> > > ------------------------------------------------
>
> OK, I was  too early to praise Gerard. The following version:
>
> def myround(x):
>      n = int(x)
>      if abs(x - n) >= 0.5 and n % 2:
>           return n + 1 - 2 * int(n<0)
>      else:
>           return n
>
> of Gerard doesn't work for 0.6 (or 0.7, etc.) It gives the answer 0
> but I would expect 1.0 ( because 0.6 doesn't end in 0.5 at all... so
> usual rules of round( ) apply)

Interestingly, you could solve this by using python 3. :-)
round(x[, n])
Return the floating point value x rounded to n digits after the
decimal point. If n is omitted, it defaults to zero. 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
(so, for example, both round(0.5) and round(-0.5) are 0, and
round(1.5) is 2). Delegates to x.__round__(n).

My turn: ;-)

def yaround(x):
i = int(x)
f = x - i
if f != 0.5 and f != -0.5: return round(x)
return 2.0*round(x/2.0)

a = (-10.0, -9.0, -8.0, -4.6, -4.5, -4.4, -4.0, -3.6, -3.5,
-3.4, -0.6, -0.5, -0.4, 0.0, 0.4, 0.5, 0.6, 0.9, 1.0,
1.4, 1.5, 1.6, 2.0, 2.4, 2.5, 2.6, 10.0, 100.0)

b = (-10.0, -9.0, -8.0, -5.0, -4.0, -4.0, -4.0, -4.0, -4.0,
-3.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0,
1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 10.0, 100.0)

for i in range(len(a)):
assert yaround(a[i]) == b[i]

```