Search code examples
pythonpython-3.xroundinginteger-divisionlargenumber

Python 3 strange division


About half an hour thinking "what am i doing wrong!?" on the 5-lines code.. because Python3 is somehow rounding big integers. Anyone know why there is a problem such:

Python2:

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

Python3:

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

Solution

  • Python 3 is not "rounding big integers". What it does is that it will return a float after division. Hence, in Python 2:

    >>> 4/2
    2
    

    while in Python 3:

    >>> 4/2
    2.0
    

    The reason for this is simple. In Python 2, / being integer division when you use integers have some surprising results:

    >>> 5/2
    2
    

    Ooops. In Python 3 this is fixed:

    >>> 5/2
    2.5
    

    This means that in Python 3, your division returns a float:

    >>> 6366805760909027985741435139224001/7
    9.095436801298612e+32
    

    This float has less accuracy than the digits you need. You then convert this to an integer with int(), and you get a number you don't expect.

    You should instead use integer division (in both Python 2 and Python 3):

    >>> 6366805760909027985741435139224001//7
    909543680129861140820205019889143L
    

    (The trailing L means it's a long integer, in Python 3 the long and the normal integer is merged, so there is no trailing L).