Velocity Reviews > Ruby > Float.round - should it be round-to-even

# Float.round - should it be round-to-even

OliverMarchand
Guest
Posts: n/a

 04-12-2006
I am suggesting to change the Float.round function to use the
well-known round-to-even method in case of a tie, i.e. x.5, where the
distance to ceil and floor is equal.

round currently uses a round-away-from-zero strategy. This strategy
will introduce a bias when applied to many numbers, i.e. the average of
the rounded numbers will be higher than that of original numbers. This
effect does make a considerable difference, despite the singular nature
of the x.5 values. Consider e.g. the computation of the median of an
array with floats.

Here is a quick hack ruby implementation which adds round to even to
the Float class:

class Float

def signum
if self>=0.0; 1.0
else; -1.0
end
end

def roundte
s = self.signum
f = self*s

rp = f-f.floor
rm = f.ceil-f
if rp>rm
return (s*f.ceil).to_i
elsif rp<rm
return (s*f.floor).to_i
else
if (f.ceil%2)==0; return (s*f.ceil).to_i
else; return (s*f.floor).to_i
end
end
end

end

Round is implemented in float.c. Anyone interested in me implementing
round-to-even there?

tschuess,
Oliver

Stefano Taschini
Guest
Posts: n/a

 04-12-2006
> Consider e.g. the computation of the median of an array with floats.

you why you want to round them?

If you are actually thinking of rounding errors, i.e., the fact that
(1/2.0) + (1/3.0) != 5/6.0, well, they are independent of Float#round.

By the way, the median [1] is hardly biased by rounding errors. It's
the mean that is sensitive to that.

Ciao,
Stefano

[1] http://mathworld.wolfram.com/StatisticalMedian.html

OliverMarchand
Guest
Posts: n/a

 04-12-2006

> you why you want to round them?

I used a (as I saw now) non-standard definition of the median, in ruby
say:

median =
array_with_floats.sort[(array_with_floats.length/2).to_f.round]

where the median is ensured to be an element of the list of values.

With the standard definition from [1], there is no rounding effect -
yes.

I have no formal analysis of this at hand or cannot quickly derive one,
but I am pretty sure that using round-to-even for my median is
statistically "better" in a useful sense then using
round-away-from-zero.

cheers,
Oliver