Преобразование экспоненты в целое число в python - PullRequest
0 голосов
/ 30 апреля 2018

Когда я выполняю этот код Python:

integer = 18243150071292141317265306851
print(int(integer / 1))

Вывод, который я получаю: 18243150071292140668971909120, который не равен integer.

Почему это происходит и как я могу сделать вывод равным integer?

1 Ответ

0 голосов
/ 04 мая 2018

Этот результат может быть достигнут в Python3 (или Python2 с истинным делением, импортированным из future), но не в Python2 в стоковом режиме.

Оператор / всегда генерирует «истинное» частное (с дробной частью), но сначала он преобразует оба аргумента в свой float (который совпадает с double в C). И это преобразование - то, где точность потеряна, потому что у этого float есть только 53 значащих двоичных числа (предполагая, что ваша платформа основана на IEEE754, как> 99%). Аргумент, деленный на 1, уже округлен таким образом и становится равным 18243150071292140668971909120.

(Кажется, документация на языке Python здесь не совсем точна в отношении эффектов оператора. отмечает , что «числовые аргументы сначала преобразуются в общий тип», но забывает, что для получения результата float, самый простой способ - полагаться на плавающее деление платформы.)

Затем преобразование обратно в int (то есть точное и практически неограниченное) дает то же значение, и вы видите его напечатанным.

Чтобы получить то, что вы ожидаете, используйте // вместо /: «деление по полу» (//) не преобразует свои аргументы в float. (OTOH, если некоторые из них уже float, он может преобразовать другой для выполнения плавающего деления, и они усекают результат в целочисленное значение пола.)

По сути, это то же самое, что вам сообщает @ PM2Ring, но оно сформировано как ответ.

Если вы хотите производить вычисления с не только целочисленными числами с точностью, превышающей обычную float, вам следует отказаться от встроенных типов и рассмотреть возможность использования decimal из стандартной библиотеки, GMP library обертка или аналогичное решение.

...