[Python-Dev] PEP 238 - The // operator should truncate instead of floor
Fredrik Johansson
fredrik.johansson at gmail.com
Wed Aug 29 18:23:40 CEST 2007
On 8/29/07, dany <danzat at gmail.com> wrote:
> Looking deeper in the python PEPs, I saw that division on integers is
> defined as: idiv(a, b) = floor(fdiv(a, b)).
> This non-quotient division leads to some odd results, e.g. Python seems
> to think -3/2+3/2 = -1. This is clearly, and correct me if I'm mistaken
> - wrong.
Rounding integer division can't be defined such that fractional
information is preserved. For example, the sum 1/2 + 1/2 (with
rounding division), doesn't equal 1 whether the rounding is done up or
down. Python's choice to round to the floor of the exact quotient is
entirely in order, and in fact, I've found it very useful in some of
my code.
There is an easy fix for your problem: write a custom division function, e.g.
def div(a, b):
if a*b > 0:
return a // b
else:
return -(abs(a)//abs(b))
Either that, or use any of the modules for rational arithmetic
available for Python.
Fredrik
More information about the Python-Dev
mailing list