Calcul sur les décimales

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
ach
Messages : 16
Inscription : mar. 10/nov./2020 18:43

Calcul sur les décimales

Message 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:
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Calcul sur les décimales

Message par SPH »

Code : Tout sélectionner

Debug 12.47+56.37+15.45+3.03
; resultat : 87.320000000000007
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Calcul sur les décimales

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Calcul sur les décimales

Message 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
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Calcul sur les décimales

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Calcul sur les décimales

Message 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:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
ach
Messages : 16
Inscription : mar. 10/nov./2020 18:43

Re: Calcul sur les décimales

Message 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()
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Calcul sur les décimales

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
ach
Messages : 16
Inscription : mar. 10/nov./2020 18:43

Re: Calcul sur les décimales

Message 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
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Calcul sur les décimales

Message 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 .....
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Calcul sur les décimales

Message 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:
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Calcul sur les décimales

Message 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.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Calcul sur les décimales

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre