Как заставить Python сохранить целое число вне научной нотации

Я пытаюсь написать метод в Python 3.2, который шифрует фразу, а затем расшифровывает ее. Проблема в том, что числа настолько велики, что, когда Python выполняет с ними математические операции, он немедленно преобразует их в научную запись. Поскольку мой код требует, чтобы все числа функционировали в экспоненциальном представлении, это бесполезно.

Что у меня есть:

coded = ((eval(input(':'))+1213633288469888484)/2)+1042

По сути, я просто получаю число от пользователя и выполняю с ним некоторые математические операции.

Я пробовал format() и пару других вещей, но не могу заставить их работать.

РЕДАКТИРОВАТЬ: я использую только четные целые числа.


person Dan G.    schedule 28.09.2012    source источник
comment
Одно небольшое замечание: Python никогда не отображает целые числа в экспоненциальном представлении. Ваша проблема здесь в том, что у вас нет int, у вас есть float. Так что вопрос не совсем корректен. Но довольно ясно, о чем вы спрашиваете, и ответ мгилсона все объясняет.   -  person abarnert    schedule 28.09.2012


Ответы (2)


В python3 '/' выполняет реальное деление (например, с плавающей запятой). Чтобы получить целочисленное деление, вам нужно использовать //. Другими словами, 100/2 дает 50.0 (с плавающей точкой), тогда как 100//2 дает 50 (целое число).

Ваш код, вероятно, необходимо изменить как:

coded = ((eval(input(':'))+1213633288469888484)//2)+1042

Однако в качестве предостережения вы можете рассмотреть возможность использования int вместо eval:

coded = ((int(input(':'))+1213633288469888484)//2)+1042
person mgilson    schedule 28.09.2012
comment
Есть по крайней мере три разных блога под названием Eval is Evil или Why Eval is Evil, каждый из которых, вероятно, стоит прочитать. Но вкратце: это усложняет отладку, открывает ваш код для атак злоумышленников и менее эффективно. - person abarnert; 28.09.2012
comment
рассмотреть eval("os.system('rm -rf *')") - person wim; 28.09.2012
comment
@DanG - Чтобы добавить к ответу Вима, eval("__import__('os').system('rm -rf *'). (другими словами, вам даже не нужно импортировать os, чтобы быть уязвимым. - person mgilson; 28.09.2012
comment
mgilson и @wim, я вроде как новичок в этом жестком, так что вы меня просто сбиваете с толку - person Dan G.; 28.09.2012
comment
@ДэнГ. -- По сути, если пользователь введет эту команду в вашу программу, она удалит все в каталоге, в котором запущена ваша программа. - person mgilson; 28.09.2012
comment
Ух ты. это может быть катастрофой! - person Dan G.; 28.09.2012

Если вы знаете, что значение с плавающей запятой на самом деле является целым числом, или вам не нужно отбрасывать дробную часть, вы можете просто преобразовать его в int перед печатью.

>>> print 1.2e16
1.2e+16
>>> print int(1.2e16)
12000000000000000
person Mark Ransom    schedule 28.09.2012
comment
Действительно? Итак, print int(1.2e24) будет отображать 1200000000000000000000000? Нет. Ответ заключается в том, чтобы в первую очередь не преобразовывать int в float; как только вы это сделаете, вы навсегда потеряете информацию, и нет никакого способа вернуть ее. - person abarnert; 28.09.2012
comment
@abarnert, да, конечно, это лучший ответ. Я давал альтернативный ответ на вопрос, заданный в заголовке, а не на конкретные обстоятельства, изложенные в ОП. - person Mark Ransom; 28.09.2012
comment
@MarkRansom да, это позволило бы мне распечатать число с плавающей запятой, но, как сказал Абарнерт, слишком много потерянных данных, чтобы это было полезно - person Dan G.; 28.09.2012
comment
@ДэнГ. вопрос и ответы останутся на сайте навсегда. Я дал этот ответ не для вас, а для будущих сотрудников Google, у которых возникнет проблема, более похожая на название. - person Mark Ransom; 28.09.2012
comment
@MarkRansom Я бы предложил этот ответ для поста под названием «Как преобразовать число в Python из научной записи». а не как сохранить число вне научной нотации в первую очередь - person Dan G.; 29.09.2012
comment
На самом деле это отвечает на мой вопрос, о котором говорится в заголовке. Я бы предпочел что-то более элегантное, но, думаю, другого выхода нет. 12*10**15 тоже подойдет, но int выглядит лучше. - person kon psych; 05.10.2014