[Python-Dev] Rounding float to int directly (Re: struct module and coercing floats to integers)

Ron Adam rrr at ronadam.com
Thu Aug 3 10:31:58 CEST 2006


Greg Ewing wrote:
> Raymond Hettinger wrote:
> 
>> -1 on an extra built-in just to save the time for function call
> 
> The time isn't the main issue. The main issue
> is that almost all the use cases for round()
> involve doing an int() on it afterwards. At
> least nobody has put forward an argument to
> the contrary yet.

I'll try to give a valid argument of the contrary.

I think you are only considering part of the usefulness of round().  In 
statistics and science math equations, rounding isn't used to get an 
integer, but instead used to give an answer that is meaningful within 
the margin of error of the data being used.

Consider an example where you are combining data that had different 
number of significant digits.  Keeping all the digits of your answer 
gives a false since of accuracy.  The extra digits are meaningless 
because the margin of error is greater than any of the digits that 
exceed the minimum number of significant digits in your data.  So you 
need to remove the extraneous digits by rounding.  Then this answer can 
be further used as data, and sense the number of significant digits is 
maintained, the margin of error can be calculated accurately.


[ NOTE: While floating point may contribute a significant error to value 
that are very large or very small, in most cases it is a very small 
amount in relation to the precision of the calculation and so the error 
can be managed without too much trouble.  In cases where it is a 
significant factor, another internal representation should probably be 
considered.  I only mention it here because someone would point it out 
(again) anyway. The accuracy of floating point is not the issue being 
discussed in this thread. ]


It makes since for round have an argument to specify the number of 
digits of precision to round to and also for it to return floating point 
numbers because rounding results to a float of n digits of precision is 
a necessary operation.

If you have the default round() case of 0 (and negative) digits of 
precision return integers, you then have a function that may sometimes 
returns integers, and sometimes returns floats. This can be problematic 
if the values are further used in division operations.  Which will 
result in many cases of.. float(round(x)) in order to convert integer 
results back to floats.

      See pep-0238:  Changing the division operator.

      http://www.python.org/dev/peps/pep-0238/

While it is true we often will use round along with converting to an 
integer, it is also true that functions that are predictable and return 
a single type are easier to use and learn.  So the question of which is 
better is a matter of point of view in this respect.

And in regard to using round() combined with division operators in 
floating point math, it is an issue of least surprises.


> Sure you can define your own function to do
> this. But that's still a considerable burden
> when you add up the effort over all the
> programs that use int(round()).

I think the only time it would be a burden is if a single program uses 
int(round()) many times, otherwise it is only a very small additional 
amount to type for each program.  In the case of single program using it 
many times, a helper function is a very practical solution.


Cheers,
   Ron





More information about the Python-Dev mailing list