¿Por qué obtengo TypeError: no se puede multiplicar la secuencia por no int de tipo 'float'?

96

Estoy escribiendo para obtener un monto de venta (por entrada) que se multiplicará por un impuesto a las ventas definido (0.08) y luego que imprima el monto total (impuesto a las ventas multiplicado por el monto de la venta).

Me encuentro con este error. ¿Alguien sabe qué podría estar mal o tiene alguna sugerencia?

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

Respuestas:

84

raw_inputdevuelve una cadena (una secuencia de caracteres). En Python, multiplicar una cadena y un flotante no tiene un significado definido (mientras que multiplicar una cadena y un número entero tiene un significado: "AB" * 3es "ABABAB"; ¿cuánto es "L" * 3.14? No responda "LLL|"). Necesita analizar la cadena a un valor numérico.

Es posible que desee probar:

salesAmount = float(raw_input("Insert sale amount here\n"))
Marc Gravell
fuente
Aprendí a leer el error de sintaxis antes de publicar aquí y usar Google. Estaba tratando de convertir raw_input para salesAmount en un int en lugar de un float. ¿Sabes por qué int no funcionará, sino por qué float sí? Desnudo conmigo, lol.
SD.
2
Multiplicar (usando el operador *) una cadena por un número entero está bien definido en Python. Multiplicar una cadena por un flotador no está definido, y es de lo que se quejaba Python.
Greg Hewgill
¡Gracias Greg! Supongo que necesito establecer algunas reglas más básicas.
SD.
1
@Raj: Dije que estaba bien definido, pero no es necesariamente lo que esperas. "abc" * 3 es "abcabcabc" y, por lo tanto, "5" * 3 es "555".
Greg Hewgill
52

Tal vez esto ayude a otros en el futuro: tuve el mismo error al intentar multiplicar un flotante y una lista de flotantes. El caso es que todos aquí hablaban de multiplicar un flotador con una cadena (pero aquí todos mis elementos eran flotantes todo el tiempo), por lo que el problema era usar el operador * en una lista.

Por ejemplo:

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

El error:

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

La solución: convierta la lista en una matriz numpy:

coff = np.asarray(coff) * C
Serenidad
fuente
¡Me gusta este enfoque!
Léo Léopold Hertz 준영
1
si no desea importar numpy, puede hacer:coff = [i * c for i in coff]
nicolas.fg
3

El problema es que salesAmount se establece en una cadena. Si ingresa la variable en el intérprete de Python y presiona enter, verá el valor ingresado entre comillas. Por ejemplo, si ingresó 56.95, verá:

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

Querrá convertir la cuerda en un flotador antes de multiplicarla por el impuesto a las ventas. Dejaré eso para que lo averigües. ¡Buena suerte!

Eric Palakovich Carr
fuente
1
Muchas gracias hermano. ¡Agradezco la ayuda! No sabía cómo almacenar un valor flotante al definir. Estaba tratando de hacerlo sobre la marcha (pero estaba tratando de cambiar el valor de una cadena a un int, así que estaba equivocado porque necesitaba un valor flotante).
SD.
1

No puede multiplicar cadena y flotar. En lugar de intentar lo siguiente. Funciona bien

totalAmount = salesAmount * float(salesTax)
Maheshnagakumar
fuente