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

Discussion in 'Ruby' started by OliverMarchand, Apr 12, 2006.

1. ### OliverMarchandGuest

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

OliverMarchand, Apr 12, 2006

2. ### Stefano TaschiniGuest

> Consider e.g. the computation of the median of an array with floats.

If your input data are floats and your result is also a float, may ask
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

Stefano Taschini, Apr 12, 2006

3. ### OliverMarchandGuest

Stefano, thanks for your input!

> If your input data are floats and your result is also a float, may ask
> 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

OliverMarchand, Apr 12, 2006