Page 1 sur 1

Calcul sur les décimales

Publié : dim. 06/déc./2020 18:29
par ach
Bonsoir
j'ai des additions(des *,/) à faire sur 4000 à 5000 nombres et quand j'additionne 12.47+56.37+15.45+3.03 j'attend 84.32 et Pb me donne 83.Quelle méthode dois je employer ?j'ai beau lire je ne trouve rien .Surement le Ba Ba pour vous mais moi rien de valable .Merci à celui qui vas m'aider. :cry:

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 18:31
par SPH

Code : Tout sélectionner

Debug 12.47+56.37+15.45+3.03
; resultat : 87.320000000000007

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 18:40
par falsam
avec la fonction debug bien sur que ça fonctionne SPH :wink:

@ach : utilise la fonction StrF()

:arrow: https://www.purebasic.com/french/docume ... /strf.html

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 18:44
par SPH

Code : Tout sélectionner

variable.f = 12.47+56.37+15.45+3.03

Debug variable
Debug StrF(variable)

; j'obtiens 87.32

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 19:09
par falsam
@SPH : Je suis d'accord le résultat est le même. Mais pour transférer le résultat dans un TextGadget par exemple, c'est la fonction StrF() que tu dois utiliser.

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 20:12
par SPH
falsam a écrit :Mais pour transférer le résultat dans un TextGadget par exemple, c'est la fonction StrF() que tu dois utiliser.
Il ne le precise pas :idea:

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 20:59
par ach
Je vous joint un exemple de mon mauvais code qui ne fonctionne pas

Code : Tout sélectionner

Structure Achats
  Mois.s
  Categories.s
  Articles.s
  Prix.f
EndStructure

  Dim Budjet.Achats(6)
  
  Budjet(0)\Mois="Janvier"
  Budjet(0)\Categories="Animaux"
  Budjet(0)\Articles="Paté chats"
  Budjet(0)\Prix=22.95
  Budjet(1)\Mois="Janvier"
  Budjet(1)\Categories="Boulangerie"
  Budjet(1)\Articles="Pain"
  Budjet(1)\Prix=11.60
  Budjet(2)\Mois="Janvier"
  Budjet(2)\Categories="Bricolage"
  Budjet(2)\Articles="Petrole"
  Budjet(2)\Prix=15.97
  Budjet(3)\Mois="Fevrier"
  Budjet(3)\Categories="Boulangerie"
  Budjet(3)\Articles="Pain"
  Budjet(3)\Prix=5.20
  Budjet(4)\Mois="Fevrier"
  Budjet(4)\Categories="Boulangerie"
  Budjet(4)\Articles="Pain"
  Budjet(4)\Prix=15.35
  OpenConsole()
  
For n=0 To 4
     If Budjet(n)\Mois="Janvier" 
         som=som+Budjet(n)\Prix
       EndIf
 Next n
 
 For n=0 To 4
      If Budjet(n)\Mois="Janvier" And Budjet(n)\Categories="Boulangerie"
        
  som_2=Strsom_2+Budjet(n)\Prix
      EndIf
  Next n  
   
For t=0 To 4
      If Budjet(t)\Mois="Fevrier" 
        som_3=som_3+Budjet(t)\Prix
        
     EndIf
 Next t
  
 For t=0 To 4
      If Budjet(t)\Categories="Boulangerie" 
        som_4= som_4+Budjet(t)\Prix
      EndIf
 Next t
 som$=StrF(som)
 som_2$=StrF(som_2)
 som_3$=StrF(som_3)
  som_4$=StrF(som_4)
  PrintN ("Résultat de Janvier: " + som$)
  Print ("")
  PrintN ("Résultat de Fevrier: " +som_3$ )
  PrintN ("")
  PrintN ("Boulangerie de Janvier = " + som_2$)
  PrintN ("")
  PrintN ("Boulangerie Janvier et Fevrier= " + som_4$)
Input()

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 21:10
par falsam
C'est normal tu ne déclares pas tes variables. Attention à ta méthode de programmation.

Define som.f
Define som_2.f
Define som_3.f
Define som_4.f

Code : Tout sélectionner

Structure Achats
  Mois.s
  Categories.s
  Articles.s
  Prix.f
EndStructure

Dim Budjet.Achats(6)


Budjet(0)\Mois="Janvier"
Budjet(0)\Categories="Animaux"
Budjet(0)\Articles="Paté chats"
Budjet(0)\Prix=22.95
Budjet(1)\Mois="Janvier"
Budjet(1)\Categories="Boulangerie"
Budjet(1)\Articles="Pain"
Budjet(1)\Prix=11.60
Budjet(2)\Mois="Janvier"
Budjet(2)\Categories="Bricolage"
Budjet(2)\Articles="Petrole"
Budjet(2)\Prix=15.97
Budjet(3)\Mois="Fevrier"
Budjet(3)\Categories="Boulangerie"
Budjet(3)\Articles="Pain"
Budjet(3)\Prix=5.20
Budjet(4)\Mois="Fevrier"
Budjet(4)\Categories="Boulangerie"
Budjet(4)\Articles="Pain"
Budjet(4)\Prix=15.35
OpenConsole()

Define som.f
For n=0 To 4
  If Budjet(n)\Mois="Janvier"
    som=som+Budjet(n)\Prix
  EndIf
Next n

Define som_2.f
For n=0 To 4
  If Budjet(n)\Mois="Janvier" And Budjet(n)\Categories="Boulangerie"
    
    som_2=Strsom_2+Budjet(n)\Prix
  EndIf
Next n 

Define som_3.f 
For t=0 To 4
  If Budjet(t)\Mois="Fevrier"
    som_3=som_3+Budjet(t)\Prix
    
  EndIf
Next t

Define som_4.f
For t=0 To 4
  If Budjet(t)\Categories="Boulangerie"
    som_4= som_4+Budjet(t)\Prix
  EndIf
Next t

som$ = StrF(som, 2)
som_2$ = StrF(som_2, 2)
som_3$ = StrF(som_3, 2)
som_4$ = StrF(som_4, 2)

PrintN ("Résultat de Janvier: " + som$)
Print ("")
PrintN ("Résultat de Fevrier: " +som_3$ )
PrintN ("")
PrintN ("Boulangerie de Janvier = " + som_2$)
PrintN ("")
PrintN ("Boulangerie Janvier et Fevrier= " + som_4$)
Input()
En début de code place systématiquement

Code : Tout sélectionner

EnableExplicit
Tu verras toutes les variables non déclarées.

Re: Calcul sur les décimales

Publié : dim. 06/déc./2020 21:48
par ach
Merci Falsam
Je me doutais bien que PB n'avais pas cette lacune mais je me suis bien pris la tête avec cela.
j'ai encore du boulot pour apprendre les bases...
encore merci

Re: Calcul sur les décimales

Publié : lun. 07/déc./2020 9:59
par Zorro
falsam a écrit :C'est normal tu ne déclares pas tes variables. Attention à ta méthode de programmation.

heu... en Purebasic , on ne declare pas les Variables !!
c'est une remarque que j'ai deja fait LOL

la doc :
Define.<type> [<variable> [= <expression>], <variable> [= <expression>], ...]

:
Permet d'assigner le même type de données à une série de variables.
ce n'est pas la meme chose !
il ne s'agit pas d'une "declaration" mais d'une definition de type

Code : Tout sélectionner

 Define.q a, b.w, c, d        ; a, c, et d sont des Quad (.q) alors que b est un Word (.w)

pour definir un type pour une variable , il suffit lors de sa premiere utilisation de mettre le type qu'on veux

exemple :

a.L = 10 ; <--- première utilisation d'une nouvelle variable avec le nom "a" et le type "L" (long) ... (elle est donc declaré au moment ou on l'utilise )


perso , je conseille d'utiliser une variable systématiquement en ecrivant le type ...

a.l restera ecrit "a.l" quelque soit sont utilisation , cela evite les soucis , une variable devrai toujours avoir sont type dans le nom n'importe ou dans le code
et c'est mieux lisible, puisqu'on lit le type lorsqu'on tombe sur la variable dans le code , un coup d'oeil suffit :)

(mais c'est pas obligatoire... juste un conseil ) :)




EnableExplicit
Tu verras toutes les variables non déclarées.

a propos de EnableExplicite , la doc est tres mal ecrite je trouve .....

Re: Calcul sur les décimales

Publié : lun. 07/déc./2020 10:08
par Marc56
On peut préciser que sans définition, une variable est considérée comme integer (d'où l'erreur courante avec les décimaux)

Voir ici
https://www.purebasic.com/french/docume ... ables.html

Savoir aussi (mais c'est mis dans l'aide) que A.s ou A$ sont valables pour déclarer une chaine (et sont deux identifiants différents). Perso je mets maintenant toujours le suffixe $ « à l'ancienne » car c'est plus explicite.

Et effectivement EnableExplicite, même si ça ajoute du boulot, permet de ne pas en perdre ensuite beaucoup par de simples fautes de frappe.

:wink:

Re: Calcul sur les décimales

Publié : lun. 07/déc./2020 11:20
par MLD
Salut a tous
Zorro tu as parfaitement raison.
J'ai même abandonner depuis longtemps l'utilisation de l'énumération automatique. Car je trouve que cela est une source de confusion.
@ Marc 56 ok c'est une une méthode avec avantages et inconvénients.

Re: Calcul sur les décimales

Publié : jeu. 10/déc./2020 10:29
par microdevweb
Pour plus de précision tu peux également utilisé un double au lieu d'un float.

Et je suis comme falsam, je commence toujours par EnableExplicit, et dans mes procédures Protected. On a vite fait une faute de frape et retrouver ce type de bug peut être galère.

Edit: Attention également à la priorité des opérateurs:

Dans ton code tu as

Code : Tout sélectionner

som=som+Budjet(n)\Prix
ce qui donne la somme + (Budget(n)\Prix)

Si tu veux diviser le somme + le Budget, tu dois les placer entre parenthèses.