Python 3 странное разделение

Около получаса думает: «Что я делаю неправильно !?» на 5-строчном коде .. потому что Python3 как-то округляет большие целые числа. Кто-нибудь знает, почему возникает такая проблема:

python2:

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

python3:

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

  • Как эмулировать 4-битное целое число в Python 3?
  • Неподдерживаемая операция: не записываемый питон
  • Почему мой сценарий Python3 не работает, чтобы передать его вывод в голову или хвост (модуль sys)?
  • Есть встроенная функция идентификации в python?
  • Force Nosetests использовать Python 2.7 вместо 3.4
  • Разбирайте XML с (X) объектами HTML
  • Ошибка xlПример не определен в Python win32com
  • В чем разница между «функцией», «методом» и «связанным методом» в Python 3?
  • 3 Solutions collect form web for “Python 3 странное разделение”

    Python 3 не «округляет большие целые числа». Что он делает, так это то, что он вернет float после деления. Следовательно, в Python 2:

     >>> 4/2 2 

    а в Python 3:

     >>> 4/2 2.0 

    Причина этого проста. В Python 2, / будучи целым делением, когда вы используете целые числа, есть неожиданные результаты:

     >>> 5/2 2 

    По электронной почте Ой. В Python 3 это исправлено:

     >>> 5/2 2.5 

    Это означает, что в Python 3 ваше подразделение возвращает float:

     >>> 6366805760909027985741435139224001/7 9.095436801298612e+32 

    Этот поплавок имеет меньшую точность, чем цифры, которые вам нужны. Затем вы преобразовываете это в целое число с int() , и получаете номер, которого вы не ожидаете.

    Вместо этого вы должны использовать целочисленное деление (как в Python 2, так и в Python 3):

     >>> 6366805760909027985741435139224001//7 909543680129861140820205019889143L 

    (Конечный L означает, что это длинное целое число, в Python 3 длинное и нормальное целое объединяется, поэтому нет конечного L).

    В Python 3 / является разделение с плавающей запятой, поэтому он может не обрабатывать ваши аргументы, как целые числа. использование

     // 

    делать целочисленное деление в Python 3.

    Вас может заинтересовать модуль фракций:

     $ pythons 'import fractions; print("%.30f" % fractions.Fraction("1/9"))' /usr/local/cpython-2.4/bin/python Traceback (most recent call last): File "<string>", line 1, in ? ImportError: No module named fractions /usr/local/cpython-2.5/bin/python Traceback (most recent call last): File "<string>", line 1, in <module> 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 
    Python - лучший язык программирования в мире.