Pourquoi j'obtiens TypeError: impossible de multiplier la séquence par non-int de type 'float'?

96

Je tape pour obtenir un montant de vente (par entrée) à multiplier par une taxe de vente définie (0,08), puis je lui demande d'imprimer le montant total (taxe de vente multipliée par le montant de la vente).

Je rencontre cette erreur. Quelqu'un sait-il ce qui ne va pas ou a des suggestions?

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.
la source

Réponses:

84

raw_inputrenvoie une chaîne (une séquence de caractères). En Python, multiplier une chaîne et un flottant n'a pas de sens défini (alors que multiplier une chaîne et un entier a une signification: "AB" * 3est "ABABAB"; combien vaut "L" * 3.14? Veuillez ne pas répondre "LLL|"). Vous devez analyser la chaîne en une valeur numérique.

Vous voudrez peut-être essayer:

salesAmount = float(raw_input("Insert sale amount here\n"))
Marc Gravell
la source
J'ai appris à lire l'erreur de syntaxe avant de publier ici et d'utiliser Google. J'essayais de convertir le raw_input pour salesAmount en int plutôt qu'en float. Savez-vous pourquoi int ne fonctionnera pas, mais plutôt float? Nu avec moi, lol.
SD.
2
La multiplication (à l'aide de l'opérateur *) d'une chaîne par un entier est bien définie en Python. La multiplication d'une chaîne par un flottant n'est pas définie, et c'est ce dont Python se plaignait.
Greg Hewgill
Merci Greg! Je suppose que je dois établir des règles plus élémentaires.
SD.
1
@Raj: J'ai dit que c'était bien défini, mais ce n'est pas forcément ce à quoi vous vous attendez. "abc" * 3 est "abcabcabc", et par conséquent "5" * 3 est "555".
Greg Hewgill
52

Peut-être que cela aidera d'autres personnes à l'avenir - j'ai eu la même erreur en essayant de multiplier un flotteur et une liste de flotteurs. Le fait est que tout le monde ici a parlé de multiplier un flottant par une chaîne (mais ici tous mes éléments étaient des flotteurs tout au long), donc le problème était en fait d'utiliser l'opérateur * sur une liste.

Par exemple:

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

L'erreur:

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

La solution - convertissez la liste en tableau numpy:

coff = np.asarray(coff) * C
Serendipity
la source
J'aime cette approche!
Léo Léopold Hertz 준영
1
si vous ne voulez pas importer numpy, vous pouvez faire:coff = [i * c for i in coff]
nicolas.fg
3

Le problème est que salesAmount est défini sur une chaîne. Si vous entrez la variable dans l'interpréteur python et appuyez sur Entrée, vous verrez la valeur entrée entourée de guillemets. Par exemple, si vous avez entré 56,95, vous verrez:

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

Vous voudrez convertir la chaîne en un flottant avant de la multiplier par la taxe de vente. Je vous laisse le soin de comprendre. Bonne chance!

Eric Palakovich Carr
la source
1
Merci beaucoup mon frère. J'apprécie l'aide! Je ne savais pas comment stocker une valeur flottante lors de la définition. J'essayais de le faire à la volée (mais j'essayais de changer la valeur d'une chaîne à un int - donc j'avais tort car j'avais besoin d'une valeur flottante).
SD.
1

Vous ne pouvez pas multiplier la chaîne et le float.au lieu d'essayer comme ci-dessous, cela fonctionne bien

totalAmount = salesAmount * float(salesTax)
Maheshnagakumar
la source