Por que obtenho TypeError: não é possível multiplicar a sequência por não-int do tipo 'float'?

96

Estou digitando para obter o valor da venda (por entrada) a ser multiplicado por um imposto sobre vendas definido (0,08) e, em seguida, faço para imprimir o valor total (imposto sobre vendas vezes o valor da venda).

Eu corro para este erro. Alguém sabe o que pode estar errado ou tem alguma sugestão?

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.
fonte

Respostas:

84

raw_inputretorna uma string (uma sequência de caracteres). Em Python, multiplicar uma string e um float não tem nenhum significado definido (enquanto a multiplicação de uma string e um inteiro tem um significado: "AB" * 3é "ABABAB"; quanto é "L" * 3.14? Por favor, não responda "LLL|"). Você precisa analisar a string para um valor numérico.

Você pode querer tentar:

salesAmount = float(raw_input("Insert sale amount here\n"))
Marc Gravell
fonte
Aprendi a ler o erro de sintaxe antes de postar aqui e usar o Google. Eu estava tentando converter raw_input para salesAmount em um int, em vez de um float. Você sabe por que int não funcionará, mas sim float? Bare comigo, lol.
SD.
2
Multiplicar (usando o operador *) uma string por um inteiro é bem definido em Python. Multiplicar uma string por um float não está definido, e é o que Python estava reclamando.
Greg Hewgill
Obrigado Greg! Acho que preciso estabelecer algumas regras mais básicas.
SD.
1
@Raj: Eu disse que estava bem definido, mas não é necessariamente o que você espera. "abc" * 3 é "abcabcabc" e, portanto, "5" * 3 é "555".
Greg Hewgill
52

Talvez isso ajude outros no futuro - eu tive o mesmo erro ao tentar múltiplo um float e uma lista de floats. O fato é que todos aqui falaram sobre multiplicar um float por uma string (mas aqui todos os meus elementos eram floats o tempo todo), então o problema estava na verdade usando o operador * em uma lista.

Por exemplo:

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

O erro:

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

A solução - converter a lista em array numpy:

coff = np.asarray(coff) * C
Acaso
fonte
Eu gosto dessa abordagem!
Léo Léopold Hertz 준영
1
se não quiser importar numpy, você pode fazer:coff = [i * c for i in coff]
nicolas.fg
3

O problema é que salesAmount está sendo definido como uma string. Se você inserir a variável no interpretador python e pressionar enter, verá o valor inserido entre aspas. Por exemplo, se você inseriu 56,95, verá:

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

Você vai querer converter a string em um float antes de multiplicá-la pelo imposto sobre vendas. Vou deixar isso para você descobrir. Boa sorte!

Eric Palakovich Carr
fonte
1
Muito obrigado mano. Agradeço a ajuda! Eu não sabia sobre ser capaz de armazenar um valor flutuante ao definir. Eu estava tentando fazer isso na hora (mas eu estava tentando mudar o valor de uma string para um int - então eu estava errado, pois precisava de um valor flutuante).
SD.
1

Você não pode multiplicar string e float. Em vez de tentar como abaixo. Funciona bem

totalAmount = salesAmount * float(salesTax)
Maheshnagakumar
fonte