Почему я получаю сообщение об ошибке при вызове int (input ()), где ввод десятичный (например, '87 .94 ')? - PullRequest
0 голосов
/ 01 марта 2012

Я начинающий программист, испытывающий трудности с умножением Python. У меня есть такой код:

def getPriceDiscount():
    price = int(input())
    if price > 3000:
        priceDiscount = price * 0.6
        return priceDiscount
    else:
        return price

Но когда я выполняю его и набираю ввод, который является десятичным числом, например 87,94, я получаю следующую ошибку:

ValueError: invalid literal for int() with base 10: '87.94'

Разве метод int() не может преобразовать строку '87 .94 'в число, позволяющее мне умножить ее на 0,6? Что я должен сделать, чтобы выполнить это преобразование?

Я использую Python 3.2.2.

Ответы [ 5 ]

5 голосов
/ 01 марта 2012

На самом деле, вы МОЖЕТЕ передать значение с плавающей запятой в int().В этом случае int() просто округляет число вниз и преобразует это значение в целочисленный тип.

Однако при вызове int("87.94") вы передаете строку, напоминающую десятичную точку, в int().int() не может напрямую преобразовать такую ​​строку в целое число.Следовательно, вы должны использовать float(), который может преобразовывать строки в числа с плавающей точкой.

3 голосов
/ 01 марта 2012

Нельзя передать строку с десятичной точкой в ​​int().Вы можете использовать float() вместо этого.Если вы хотите только неотъемлемую часть, т.е. усечь .94 в 87.94, вы можете сделать int(float('87.94')).

1 голос
/ 01 марта 2012
def getPriceDiscount():
    while True:
        try:
            price, percent = float(input()), 0.6
            break
        except ValueError:
            continue
    return price * percent if price > 3000 else price

print(getPriceDiscount())
1 голос
/ 01 марта 2012

int (сокращение от "integer") - это целое число.float (сокращение от «число с плавающей точкой») - это число с десятичной точкой.

int() возвращает значение int, созданное из входного аргумента.Вы можете использовать его для преобразования строки типа "15" в int 15 или float как 12.059 в int 12.

float(), возвращающейfloat создан из входного аргумента.Вы можете использовать его для преобразования строки типа "10.5" в float 10.5 или даже int как 12 в float 12.0.

Если вы хотитезаставить price быть целым числом, но вы хотите принять число с плавающей запятой как типизированный ввод, вам нужно сначала сделать ввод float, а затем преобразовать его с помощью int():

price = int(float(input())

Обратите внимание, что если вы умножите int на float, например, на коэффициент дисконтирования, результатом будет float.

Также обратите внимание, что мой пример выше не округляет число -это просто усекает материал после десятичной точки.Например, если введено значение "0.6", то значение price в итоге составит 0.Не то, что вы хотите?Тогда вам нужно будет сначала использовать функцию round() для float.

price = int(round(float(input()))

Если вы намеревались использовать вычисления с плавающей запятой (что имеет смысл, если мы говорим о цене товара), тогда не выполняйте int преобразование.Просто используйте float.Вы можете все еще хотеть сделать некоторое округление.Если вы хотите округлить до 2 десятичных знаков, вы можете вызвать округление со вторым аргументом как 2:

price = round(float(input()),2)

Наконец, вы можете захотеть заглянуть в Python's decimal module , поскольку существуют ограничения при использовании чисел с плавающей запятой.Смотрите здесь для получения дополнительной информации: http://docs.python.org/tutorial/floatingpoint.html

1 голос
/ 01 марта 2012

Проблема в том, что вы пытаетесь сделать два преобразования одновременно, и одно из них неявно .

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

>>> int('87')
87

И по той же причине будет работать и следующее:

>>> float('87')
87.0
>>> float('87.94')
87.94
>>> int(87.94)
87

Имейте в виду то, что было сказано, и посмотрите на разницумежду:

>>> int(float('87.94'))
87

и

>>> int('87.94')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '87.94'

Как вы видите, проблема заключается в том, что вы подразумеваете преобразование float() до перехода к int(), но как мог догадаться компилятортот?Существует множество доступных рабочих преобразований для строки '87 .94 '.Должен ли компилятор перепробовать их все, прежде чем выяснить, какой onw будет работать с int?А что если есть два или более, которые вернут что-то, что будет работать с целым числом?

Примеры:

>>> int(hash('87.94'))
4165905645189346193
>>> int(id('87.94'))
22325264
>>> int(max('87.94'))
9
>>> int(input('87.94'))
87.94111
111

Должен ли компилятор выбрать float() для вас?
Я так не думаю: Явное лучше, чем неявное .


В любом случае, если вы собираетесь использовать это число для умножения на число с плавающей запятой 0.6.Вы можете напрямую преобразовать его в float().

Изменить эту строку:

price = int(input())

с помощью:

price = float(input())

И все будетбудьте в порядке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...