Почему я получаю TypeError: невозможно умножить последовательность на не-int типа float?

99

Я печатаю, чтобы получить сумму продажи (по входным данным), которую нужно умножить на определенный налог с продаж (0,08), а затем распечатать общую сумму (налог с продаж, умноженный на сумму продажи).

Я столкнулся с этой ошибкой. Кто-нибудь знает, что может быть не так или есть предложения?

salesAmount = raw_input (["Insert sale amount here \n"])
['Insert sale amount here \n']20.99
>>> salesTax = 0.08
>>> totalAmount = salesAmount * salesTax

Traceback (most recent call last):
  File "<pyshell#57>", line 1, in <module>
    totalAmount = salesAmount * salesTax
TypeError: can't multiply sequence by non-int of type 'float'
SD.
источник

Ответы:

86

raw_inputвозвращает строку (последовательность символов). В Python умножение строки и числа с плавающей запятой не имеет определенного значения (в то время как умножение строки и целого числа имеет значение: "AB" * 3есть "ABABAB"; сколько "L" * 3.14? Пожалуйста, не отвечайте "LLL|"). Вам необходимо преобразовать строку в числовое значение.

Вы можете попробовать:

salesAmount = float(raw_input("Insert sale amount here\n"))
Марк Гравелл
источник
Я научился читать синтаксические ошибки, прежде чем размещать здесь и использовать Google. Я пытался преобразовать raw_input для salesAmount в int, а не в float. Вы знаете, почему int не будет работать, а будет работать с плавающей точкой? Голый со мной, лол.
SD.
3
Умножение (с использованием оператора *) строки на целое число хорошо определено в Python. Умножение строки на число с плавающей запятой не определено, и это то, на что жаловался Python.
Грег Хьюгилл,
Спасибо, Грег! Думаю, мне нужно выработать еще несколько основных правил.
SD.
1
@Raj: Я сказал, что это четко определено, но это не обязательно то, что вы ожидаете. «abc» * 3 - это «abcabcabc», и поэтому «5» * 3 - «555».
Грег Хьюгилл,
54

Возможно, это поможет другим в будущем - у меня была такая же ошибка при попытке объединить число с плавающей запятой и список с плавающей запятой. Дело в том, что здесь все говорили об умножении числа с плавающей запятой на строку (но здесь все мои элементы были с плавающей запятой), поэтому проблема заключалась в использовании оператора * в списке.

Например:

import math
import numpy as np
alpha = 0.2 
beta=1-alpha
C = (-math.log(1-beta))/alpha

coff = [0.0,0.01,0.0,0.35,0.98,0.001,0.0]
coff *= C

Ошибка:

    coff *= C 
TypeError: can't multiply sequence by non-int of type 'float'

Решение - преобразовать список в массив numpy:

coff = np.asarray(coff) * C
Интуиция
источник
Мне нравится такой подход!
Лео Леопольд Герц 준영
1
если вы не хотите импортировать numpy, вы можете сделать:coff = [i * c for i in coff]
nicolas.fg
3

Проблема в том, что salesAmount задается как строка. Если вы введете переменную в интерпретаторе Python и нажмете Enter, вы увидите введенное значение в кавычках. Например, если вы ввели 56,95, вы увидите:

>>> sales_amount = raw_input("[Insert sale amount]: ")
[Insert sale amount]: 56.95
>>> sales_amount
'56.95'

Вы захотите преобразовать строку в число с плавающей запятой, прежде чем умножать ее на налог с продаж. Я оставлю это на ваше усмотрение. Удачи!

оборота Эрик Палакович Карр
источник
1
Большое спасибо, братан. Я ценю помощь! Я не знал о возможности хранить значение с плавающей запятой при определении. Я пытался сделать это на лету (но я пытался изменить значение со строки на int - поэтому я был неправ, так как мне нужно было значение с плавающей запятой).
SD.
1

Вы не можете умножить строку и float. Вместо этого попробуйте, как показано ниже. Он отлично работает

totalAmount = salesAmount * float(salesTax)
Махешнагакумар
источник