Этот результат может быть достигнут в Python3 (или Python2 с истинным делением, импортированным из future
), но не в Python2 в стоковом режиме.
Оператор /
всегда генерирует «истинное» частное (с дробной частью), но сначала он преобразует оба аргумента в свой float
(который совпадает с double
в C). И это преобразование - то, где точность потеряна, потому что у этого float
есть только 53 значащих двоичных числа (предполагая, что ваша платформа основана на IEEE754
, как> 99%). Аргумент, деленный на 1, уже округлен таким образом и становится равным 18243150071292140668971909120.
(Кажется, документация на языке Python здесь не совсем точна в отношении эффектов оператора. отмечает , что «числовые аргументы сначала преобразуются в общий тип», но забывает, что для получения результата float
, самый простой способ - полагаться на плавающее деление платформы.)
Затем преобразование обратно в int
(то есть точное и практически неограниченное) дает то же значение, и вы видите его напечатанным.
Чтобы получить то, что вы ожидаете, используйте //
вместо /
: «деление по полу» (//
) не преобразует свои аргументы в float
. (OTOH, если некоторые из них уже float
, он может преобразовать другой для выполнения плавающего деления, и они усекают результат в целочисленное значение пола.)
По сути, это то же самое, что вам сообщает @ PM2Ring, но оно сформировано как ответ.
Если вы хотите производить вычисления с не только целочисленными числами с точностью, превышающей обычную float
, вам следует отказаться от встроенных типов и рассмотреть возможность использования decimal
из стандартной библиотеки, GMP
library обертка или аналогичное решение.