Addition de variables type "float"

Fermé
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 - 2 févr. 2021 à 08:11
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 25 févr. 2021 à 16:03
Salut !

J'ai deux questions de noob qui affligeront tout le monde mais tant pis, je me lance.

1) Je souhaite poser des questions à l'utilisateur, auxquelles il doit répondre en introduisant des nombres à virgule (par exemple "40,00" pour a et "12,30" pour b, suivant le schéma suivant:

a = input("Combien vaut a ? ")
b = input("combien vaut b ? ")
c = float(a) + float(b)
print(c)

Et là j'ai l'erreur "ValueError: could not convert string to float:"

Je me doute que c'est juste un truc idiot à bidouiller mais ça me simplifierait bien la vie si j'obtenais un coup de main.

2) J'aimerais savoir s'il est possible de mettre en forme les nombres par le biais de la fonction "write".

en gros, j'introduis une variable; a=1000

15 réponses

jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
2 févr. 2021 à 08:15
Suite:

Et je souhaite avoir une restitution par une commande type doc.write(a)
sous la forme 1 000,00 (séparateur des mille et deux chiffres après la virgule).

Merci par avance.
0
georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024 2 248
2 févr. 2021 à 08:53
Bonjour,

On a tous été noob un jour, ce n'est pas un défaut. Je dirais même que c'est un état permanent, nous sommes tous le noob de quelqu'un.

Par ailleurs, la possibilité d'une aide est facilitée par l'utilisation des balises de code, qui permet d'une part de vérifier que vous ayez respecté la syntaxe de python et notamment l'indentation, d'autre part qu'apparaissent les messages d'erreur, qui sont un élément important de la progression en matière de codage.

le mode d'emploi est ici et vous pourrez le vérifier immédiatement:

https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Sur vos questions:

bien que python repose sur le typage dynamique des variables, la syntaxe de la vesrion 3.x implique un string comme résultat d'un input, d'où le message d'erreur.

Pour entrer une variable int votre instruction devrait être sous la forme:

a = int(input("Combien vaut a ? "))

ce qui donnerait directement un entier et éviterait le recours 'la a déclaration dans votre dernière ligne.

Je vous laisse deviner ce qu'il faut écrire pour un float

Pour la deuxième question, le temps que je vérifie un autre intervenant aura donné la syntaxe mais cela repose sans doute sur l'utilisation de la fonction format() puis de la fonction write() pour écrire dans un fichier.

Cordialement
0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
2 févr. 2021 à 09:03
Grazie mille Georges !
0
georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024 2 248
2 févr. 2021 à 09:11
prego, jipi.
0
georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024 2 248
2 févr. 2021 à 09:44
Infos sur le formatage:

https://stackoverflow.com/questions/6149006/display-a-float-with-two-decimal-places-in-python
https://docs.python.org/fr/3.9/library/stdtypes.html

A regarder pour la fonction write()

https://docs.python.org/3/tutorial/inputoutput.html

Je n'ai pas vérifié si l'on peut y insérer la fonction float() ou s'il faut d'abord réaliser une conversion de float formaté en string, mais c'est un bel exercice de vérifier qu'on peut intégrer le float dans un write().

Sous la forme write(format(..))

Ce serait bien de nous faire un retour sous forme d'un script sous balises.

Merci d'avance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
2 févr. 2021 à 10:10
Ok. J'ai survolé les liens, ça a l'air de bien dégrossir la question.

Je vais potasser ça ce soir.

Encore merci Georges !
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 2 févr. 2021 à 16:28
Bonjour jipi10,


C'est bizarre quand même, j'ai testé ton code tel quel et il fonctionne très bien:

0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
2 févr. 2021 à 16:49
Georges explique dans son message que les versions postérieures à la 3.0 considèrent la variable issue d'un INPUT comme un string.

peut-être utilises-tu une version antérieure.
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 2 févr. 2021 à 16:54
non, je suis en 3.7.2

donc la variable issue de input est bien une string

mais ensuite float(a) converti bien la string a en float, de même pour b

et ca donne ce que tu vois sur mon image ...

il marche très bien ton code
0
georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024 2 248
2 févr. 2021 à 17:18
Bonjour Phil,

Je n'ai effectivement testé que la première ligne (dans thonny, qui se prête au code sans enregistrer le script, comme tu le sais sans doute) puisqu'il signalait avoir eu un message d'erreur.

As-tu une idée d'où ça vient? de l'IDE utilisé. C'est quand même surprenant non?

jipi aura découvert une autre méthode, qui lui servira peut-être par ailleurs.

Je vais faire ton test, pour ma propre culture, sans aucun doute du résultat.

Et pour ce que je suggère plus loin, est-il possible de mixer le write() et le format()

Ca m'a donné l'occasion de te saluer.

A plus
0
georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024 2 248
2 févr. 2021 à 17:53
@ jipi

Testé sous mu et thonny et fonctionne sans problème. Quel ide ou éditeur aviez vous utilisé?
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
2 févr. 2021 à 18:02
Bonjour Georges,

Oui, c'est bizarre, son code tout simple fonctionne sans erreur

Personnellement, j'ai IDLE comme IDE, mais en fait, j'utilise mon éditeur de texte favori

(UltraEdit32), et j'exécute en double-cliquant le fichier .py dans mon répertoire
0
georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024 2 248
2 févr. 2021 à 18:07
Attendons le retour de jipi.

Je t'ai repéré sur un circuit automobile et n'ai pas eu de réponse à ma question:

est-il possible de mixer le write() et le format()

L'ivresse de la vitesse?
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178 > georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024
2 févr. 2021 à 18:12
write, c'est pour écrire dans un fichier ...
0
georges97 Messages postés 11832 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 20 avril 2024 2 248 > Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024
2 févr. 2021 à 18:18
J'ai eu l'impression que c'est ce qu'il voulait faire

je souhaite avoir une restitution par une commande type doc.write(a)
sous la forme 1 000,00 (séparateur des mille et deux chiffres après la virgule)


le doc m'a fait penser qu'il voulait transférer le résultat dans un fichier texte mais c'est sans doute une erreur de ma part.
0
jee pee Messages postés 39598 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 avril 2024 9 228
Modifié le 2 févr. 2021 à 18:04
Bonjour,

"par exemple "40,00" pour a et "12,30" pour b"   
la virgule en séparateur pour la conversion float ne vas passer
0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
14 févr. 2021 à 10:50
Oui, apparemment, il s'agit d'un problème de virgule... Dommage, les virgules sont graphiquement plus pertinentes dans un texte de type contrat.

Je vous fais un rendu sur les float et les séparateurs dès que j'ai programmé mon module. (Pas tout de suite, je suis loin d'être une flèche.)

Merci à tous en tout cas.
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178 > jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024
14 févr. 2021 à 10:54
Bonjour Jipi,

Qu'on le veuille ou non, en informatique, le séparateur décimal est un point et pas une virgule ...
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929 > Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024
Modifié le 14 févr. 2021 à 11:51
Bonjour
le séparateur décimal est un point et pas une virgule ...
certes mais il y a des langages qui prennent en compte la culture de l'ordinateur

Et au pire ça se traite.

nombreStringFormatFrancais = "1 234,56"
intermediaire = nombreStringFormatFrancais.replace(" ","")
nombreStringFormatInformatique = intermediaire.replace(",", ".")
nombre = float(nombreStringFormatInformatique)
print("le nombre est ", nombre)
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
Modifié le 14 févr. 2021 à 19:03
Ok, mais dans les langages de programmation en général (C, C++, Basic, Java, Tcl, Python ...), c'est toujours un point décimal
culture ou pas culture ...

Mais bon, tu sais comment traiter le problème maintenant ...

a = input("Combien vaut a ? ")
a = float(a.replace(',','.'))
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929 > Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024
14 févr. 2021 à 20:17
Tu sites C++ et Basic, les versions .Net de ces langages prennent en compte la culture
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 2 févr. 2021 à 18:07
Ah ça, c'est sur !

En fait, si c'est vraiment ça qu'il entre, tout vient de là !
0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
Modifié le 24 févr. 2021 à 19:00
A y'est, ça marche !

Je vous propose ce petit programme qui calcule la mensualité d'un prêt avec ou sans différé, à partir du montant du prêt, de son taux et de sa durée.

(cliquer sur le lien en bas de page pour avoir les indentations correctes)


import locale
locale.setlocale(locale.LC_ALL, '')

montantcrédit= float(input("Quel est le montant du prêt ? "))
tauxcrédit= float(input("Quel est le taux d'intérêt ? "))
duréecrédit=int(input("Quelle est la durée du crédit en mois ? "))
intérêtmensuel=(montantcrédit*(tauxcrédit/100)/12)
intérêtannuel=(montantcrédit*(tauxcrédit/100))

présencedifféré= input("Y a-t-il un différé ? ")

if présencedifféré=="o":
typedifféré=input("le différé est-il partiel ou total (p/t) ? ")
duréedifféré=int(input("Merci d'indiquer la durée du différé "))
duréecrédit=int(duréecrédit)-int(duréedifféré)
if typedifféré =="p":
print("\n\nla mensualité du différé partiel est de " + ("{:,.2f}".format(intérêtmensuel).replace(',', ' ').replace('.', ',')) + " euros durant " + str(duréedifféré) + " mois")
elif typedifféré == "t":
indexdifféré=int((duréedifféré)/12)
for i in range (1, indexdifféré + 1):
intérêtannuel = (montantcrédit * (tauxcrédit / 100))
montantcrédit=montantcrédit + intérêtannuel
print("\n\ndifféré total durant " + str(duréedifféré) + " mois")

mensualitéamortissement= ((montantcrédit * (tauxcrédit/100))/12)/(1-(1+((tauxcrédit/100)/12)) **-(duréecrédit))
print("La mensualité d'amortissement est de " + ("{:,.2f}".format(mensualitéamortissement).replace(',', ' ').replace('.', ',')) + " euros durant " + str(duréecrédit) + " mois")

https://www.zupimages.net/up/21/08/zark.png
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
24 févr. 2021 à 19:00
Dans le message 2, Georges 97 a mis un lien vers le petit tuto qu'il est primordial de lire et appliquer pour poster un code.

En l'état ton code n'est fonctionnel
0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
25 févr. 2021 à 08:34
Désolé, en plus d'être un noob, je suis un boulet !!!

J'ai corrigé.
0
jee pee Messages postés 39598 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 avril 2024 9 228
24 févr. 2021 à 19:04
Tu as oublié les balises code du forum.

Zut, à la seconde ligne ça plante :
Quel est le taux d'intérêt ? 1,25
Traceback (most recent call last):
File "D:\Dev\Python\Exe\ccm\interet.py", line 5, in <module>
tauxcrédit= float(input("Quel est le taux d'intérêt ? "))
ValueError: could not convert string to float: '1,25'

tu n'as pas réglé la saisie de la virgule

0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
25 févr. 2021 à 08:39
Oui, il faut mettre un point. Le tout est de le savoir sinon ça plante.
0
jee pee Messages postés 39598 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 avril 2024 9 228 > jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024
25 févr. 2021 à 09:39
tu mets des accents dans les noms de variables, une virgule dans l'affichage du montant du remboursement, mais la virgule ne fonctionne pas dans la saisie, ce n'est pas cohérent ;-)))
0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2 > jee pee Messages postés 39598 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 avril 2024
25 févr. 2021 à 13:34
Ce n'est pas si important pour moi. Ma problématique résidait surtout dans la restitution des nombres. Je dirais même que l'utilisation du point situé dans le pavé numérique facilite la saisie des nombres.

Apparemment, comme le dit Phil, c'est une question culturelle.

Merci à tous en tous cas et à la prochaine.
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178 > jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024
Modifié le 25 févr. 2021 à 16:39
Oui mais quand même, Phil il dit aussi que les accents dans les noms de variables, c'est plutôt vilain
Et pour tes saisies tu aurais pu faire ça:

def get_float(s):
    if(',' in s): s = s.replace(',','.')
    return(float(s))

montant_credit  = get_float(input('Quel est le montant du prêt ? : '))

etc ..
0
jipi10 Messages postés 35 Date d'inscription samedi 15 août 2020 Statut Membre Dernière intervention 5 février 2024 2
25 févr. 2021 à 08:33
import locale
locale.setlocale(locale.LC_ALL, '')

montantcrédit= float(input("Quel est le montant du prêt ? "))
tauxcrédit= float(input("Quel est le taux d'intérêt ? "))
duréecrédit=int(input("Quelle est la durée du crédit en mois ? "))
intérêtmensuel=(montantcrédit*(tauxcrédit/100)/12)
intérêtannuel=(montantcrédit*(tauxcrédit/100))

présencedifféré= input("Y a-t-il un différé ? ")

if présencedifféré=="o":
    typedifféré=input("le différé est-il partiel ou total (p/t) ? ")
    duréedifféré=int(input("Merci d'indiquer la durée du différé "))
    duréecrédit=int(duréecrédit)-int(duréedifféré)
    if typedifféré =="p":
        print("\n\nla mensualité du différé partiel est de " + ("{:,.2f}".format(intérêtmensuel).replace(',', ' ').replace('.', ',')) + " euros durant " + str(duréedifféré) + " mois")
    elif typedifféré == "t":
        indexdifféré=int((duréedifféré)/12)
        for i in range (1, indexdifféré + 1):
            intérêtannuel = (montantcrédit * (tauxcrédit / 100))
            montantcrédit=montantcrédit + intérêtannuel
        print("\n\ndifféré total durant " + str(duréedifféré) + " mois")

mensualitéamortissement= ((montantcrédit * (tauxcrédit/100))/12)/(1-(1+((tauxcrédit/100)/12)) **-(duréecrédit))
print("La mensualité d'amortissement est de " + ("{:,.2f}".format(mensualitéamortissement).replace(',', ' ').replace('.', ',')) + " euros durant " + str(duréecrédit) + " mois")
0