erreur de python avec : ValueError: invalid literal for int() with base 10: '2.5'

sous python3.6.5

Le problème exposé dans ce sujet a été résolu.

Bonjour, j’apprends en ce moment à utiliser python. (sur zds :D )

J’ai fait un petit programme très simple permettant de calculer le rayon et le périmètre d’un cercle, mais lorsque j’indique un nombre à virgule il m’envoie cette erreur :

Traceback (most recent call last):
  File "3-la-surface-et-le-perimetre-d-un-disque.py", line 6, in <module>
    rayon =int(rayon)
ValueError: invalid literal for int() with base 10: '2.5'

Pour infos le code est :

rayon = input("met le rayon du cercle : ")

rayon =int(rayon)
print(repr(rayon))
surface = rayon * 3.14 ** 2

perimetre = rayon * 2 * 3.14

print("le périmètre du cercle est : ",perimetre,"\net le rayon est : ",rayon)#

et la valeur de rayon est 2.5. Le problème semble venir de int() mais je ne sais pas comment y remédier… :euh:

Merci d’avance de vos réponses !

Salut,

Je connais Python assez vaguement, mais je dirais que le souci c’est que int() attend un nombre entier (1, 2, 3, 4 etc.) et que tu lui fournis un nombre décimal.
Essaie de remplacer int() par float(), je pense que ça devrait fonctionner.

+1 -0

Salut !

Je vois que tu es nouveau, bienvenue sur Zeste de Savoir ! :)

En effet, le problème vient bien du int. Pour comprendre, il faut savoir que int est la contraction du mot anglais integer, qui veut dire « entier ». C’est donc un type qui est sensé contenir des nombres entiers, c’est-à-dire sans partie décimale. Si tu essaie avec 2, tout devrait marcher sans problème, car deux est bien un entier. En revanche, 2.5 ne peut être converti tel que puisqu’il contient une partie décimale (0.5).

Pour représenter un nombre avec une partie décimale, il faut utiliser le type float (« flottant »), qui contient un nombre dit « à virgule flottante », c’est-à-dire que la virgule peut prendre des positions différentes, elle peut-être après une partie entière à 2 chiffres comme à 12 chiffres. Quand tu écrit dans ton terminal un nombre avec une virgule (ou plus exactement, avec un point, puisque Python est anglophone), il créé un float. Pour t’en convaincre, tu peux faire ceci.

>>> type(2)
<class 'int'>
>>> type(2.5)
<class 'float'>

Bien sur, tous les calculs marchent de la même façon avec des int ou des float. D’ailleurs, certains calculs (les divisions, notamment) avec des entiers renvoient des flottants.

>>> 4 / 2
2.0
>>> type(2.0)
<class 'float'>

Il y a d’ailleurs une petite expérience amusante à tenter : calculer 0.1 + 0.2. Logiquement, la réponse devrait être 0.3. Pourtant…

>>> 0.1 + 0.2
0.30000000000000004

o_O

Oui, ça surprend, mais c’est "normal". Tu sais sans doute que les ordinateurs enregistrent tout en binaire. Or, il se trouve que "0.1" ne tombe pas juste en binaire, et Python enregistre donc une approximation de "0.1". Dans la plupart des cas, ça ne pose pas trop de problème (ici, l’erreur se situe tout de même 16 chiffres après la virgule, ce qui est négligeable), mais c’est quand même bon à savoir.

Python fournit de base un module pour ce genre de cas, qui s’appelle decimal.

>>> from decimal import Decimal
>>> Decimal("0.1") + Decimal("0.2")  # Note : Ce sont bien des strings, pas des flottants ("0.1" et pas 0.1).
Decimal('0.3')

Petit bonus : Pour utiliser le nombre pi, tu peux importer le module math et utiliser math.pi. ;)

>>> import math
>>> math.pi
3.141592653589793
+2 -0

Merci pour vos réponses, ça marche ! mais c’est étrange, j’avais le souvenir qu’avec python 2.7 on pouvait mettre des nombres à virgule dans des int() …

En tout cas ça marche et merci à vous !

Indépendamment de la question de programmation, la surface d’un cercle, c’est πR2\pi R^2, pas Rπ2R \pi^2.

Gabbro

Effectivement je me suis trompé. Merci de l’avoir remarqué, je n’y avais pas fait attention :)

Merci pour vos réponses, ça marche ! mais c’est étrange, j’avais le souvenir qu’avec python 2.7 on pouvait mettre des nombres à virgule dans des int() …

Tu peux lui passer un float pour en extraire la partie entière, mais pas la représentation littérale d’un float : dans le premier cas, c’est un cast, dans le second, une erreur de syntaxe.

>>> int(3.14)
3
+0 -0

Merci pour vos réponses, ça marche ! mais c’est étrange, j’avais le souvenir qu’avec python 2.7 on pouvait mettre des nombres à virgule dans des int() …

En tout cas ça marche et merci à vous !

Indépendamment de la question de programmation, la surface d’un cercle, c’est πR2\pi R^2, pas Rπ2R \pi^2.

Gabbro

Effectivement je me suis trompé. Merci de l’avoir remarqué, je n’y avais pas fait attention :)

5IM0N

Je viens de tester avec Python 2, il n’est pas possible de passer une string contenant un nombre à virgule à int. En revanche, il est possible de lui passer un float, ce qui le convertit en entier (et supprime donc sa partie décimale).

# Avec Python 2.7
>>> int("2.5")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '2.5'
>>> int(2.5)  # Marche aussi avec Python 3.
2
>>> float(2)  # Inversement, on peut créer un flottant à partir d'un entier.
2.0

Edit : Grillé par nohar.

+0 -0

Merci, il faudra que je voie plus en détail les float, int, et autres, car il y a des trucs qui m’échappent. :euh:

5IM0N

Surtout, n’hésite pas à poser des questions si quelque chose en particulier te tracasse ! :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte