Python 3 división extraña

Alrededor de media hora pensando “¿Qué estoy haciendo mal?” en el código de 5 líneas … porque Python3 de alguna manera está redondeando grandes enteros. Alguien sabe por qué hay un problema como:

Python2:

int(6366805760909027985741435139224001 # This is 7**40. / 7) == 909543680129861140820205019889143 # 7**39 

Python3:

 int(6366805760909027985741435139224001 / 7) == 909543680129861204865300750663680 # I have no idea what this is. 

Python 3 no es “redondear grandes enteros”. Lo que hace es que devolverá un flotador después de la división. Por lo tanto, en Python 2:

 >>> 4/2 2 

mientras que en Python 3:

 >>> 4/2 2.0 

La razón de esto es simple. En Python 2, ser una división de enteros cuando usas enteros tiene algunos resultados sorprendentes:

 >>> 5/2 2 

Ups En Python 3 esto está arreglado:

 >>> 5/2 2.5 

Esto significa que en Python 3, tu división devuelve un flotante:

 >>> 6366805760909027985741435139224001/7 9.095436801298612e+32 

Este flotador tiene menos precisión que los dígitos que necesita. Luego lo convierte en un entero con int() y obtiene un número que no espera.

En su lugar, debe usar la división de enteros (tanto en Python 2 como en Python 3):

 >>> 6366805760909027985741435139224001//7 909543680129861140820205019889143L 

(La L al final significa que es un entero largo, en Python 3, el entero largo y el normal se fusionan, por lo que no hay L).

En Python 3 / es la división de punto flotante, por lo que no puede tratar tus argumentos como enteros. Utilizar

 // 

hacer división entera en Python 3.

Te puede interesar el módulo de fracciones:

 $ pythons 'import fractions; print("%.30f" % fractions.Fraction("1/9"))' /usr/local/cpython-2.4/bin/python Traceback (most recent call last): File "", line 1, in ? ImportError: No module named fractions /usr/local/cpython-2.5/bin/python Traceback (most recent call last): File "", line 1, in  ImportError: No module named fractions /usr/local/cpython-2.6/bin/python 0.111111111111111104943205418749 /usr/local/cpython-2.7/bin/python 0.111111111111111104943205418749 /usr/local/cpython-3.0/bin/python 0.111111111111111104943205418749 /usr/local/cpython-3.1/bin/python 0.111111111111111104943205418749 /usr/local/cpython-3.2/bin/python 0.111111111111111104943205418749 /usr/local/cpython-3.3/bin/python 0.111111111111111104943205418749 /usr/local/cpython-3.4/bin/python 0.111111111111111104943205418749 /usr/local/pypy-2.2/bin/pypy 0.111111111111111104943205418749 /usr/local/jython-2.7b1/bin/jython 0.111111111111111100000000000000