IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

calcul fonction math division


Sujet :

Delphi

  1. #1
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 68
    Par défaut calcul fonction math division
    salut a toutes et tous,
    mon edi delphi7 entreprise, je suis débutant juste experience perso,
    j'ai une question pour une fonction pourtant simple mais qui abouti a zero ?

    // but de cette formule : 12*(5000/10000+5000) = 4 /// 12*(5000/15000) = 4///////////////

    je devrai avoir comme résultat le chiffre 4 mais j'ai en resultat zero ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    uses math;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    v, c, r1, r2, rt, val: integer;
    
    begin
    
    v:= strtoint (edit1.Text);  ///////////////////     valeur  12
    c := strtoint (label11.Caption); //////////////    valeur 5000
    r1:= strtoint(edit3.text);   /////////////////       valeur 10000
    r2 := strtoint(edit4.Text);   /////////////////      valeur  5000
    rt:= r1+r2;                       /////////////////       calcul 5000 + 10000 = 15000 
     label15.Caption:= inttostr (rt);   //////////     affiche bien 15000 ok parfait
    
    
    val:= v *(c div rt);  ////////// retourne zero au lieu de 4  ???????
    
    label12.Caption:= inttostr (val); ///////////////    affiche zero dans le résultat label 12
    end;

    pouvez vous m'aidé
    cordialement
    Alain

  2. #2
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 100
    Par défaut
    Bonjour,

    Le mot Val est utilisé en interne il faut éviter de l'utiliser comme nom de variable,
    Pour résoudre le problème il faut enlever les parenthèses pour garder la précision avec les opérations entier : v * c div rt
    lorsque on force (c div rt ) le résultat de ce facteur est fractionnel 5000/(10000+5000)=0.33 et nul comme résultat entier

  3. #3
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 68
    Par défaut
    bonjour Informt2025,
    super effectivement sa marche beaucoup mieux comme sa
    j'au remplacer val par rs pour résultat
    et j'ai modifier avec v*c div rt
    youpi sa fonctionne et sa explique pourquoi j'avais en retour zéro
    bien merci
    résolut
    cordialement
    Alain


    Citation Envoyé par Informt2025 Voir le message
    Bonjour,

    Le mot Val est utilisé en interne il faut éviter de l'utiliser comme nom de variable,
    Pour résoudre le problème il faut enlever les parenthèses pour garder la précision avec les opérations entier : v * c div rt
    lorsque on force (c div rt ) le résultat de ce facteur est fractionnel 5000/(10000+5000)=0.33 et nul comme résultat entier

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 606
    Par défaut
    Salut à tous.

    Citation Envoyé par alll1
    // but de cette formule : 12*(5000/10000+5000) = 4 /// 12*(5000/15000) = 4///////////////
    Non, cela ne fait pas 4.

    La priorité est d'abord à ce qui se trouve entre les parenthèses.
    Puis à l'intérieur de celles-ci, la priorité est à la division.
    En décomposant, cela donne :
    --> 12 x ( 5000 / 10000 + 5000)
    --> 12 x ( 1/2 + 5000)
    --> 12 x 5000.5
    --> 60006

    Il suffit de copier ta formule et de la mettre dans la calculatrice de Windows.
    Après avoir copié, tu cliques sur le touche égale ("=") et tu verras le résultat apparaitre.

    Si tu veux que cela fasse 4, il faut ajouter un autre niveau de parenthèses :
    12 * (5000 / (10000 + 5000))
    @+

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 974
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Selon le niveau de précision requis, utiliser la division entière peut ne pas être adéquat et mieux vaudrait utiliser des réels et la division entre eux puis garder la partie entière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function MonCalcul(v, c, r1, r2: integer): integer;
    var
      res: Extended;
    begin
      res := v * c / (r1 + r2);
     
      Result := Trunc(res); // affecte la partie entière du résultat du calcul comme valeur de retour de la fonction
    end;
    Delphi 5 Pro - Delphi 12 Athènes Community Edition - CodeTyphon 8.80 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 68
    Par défaut
    bonsoir artemus24,

    alors oui et non
    dans la formule il aurait falut decomposé differement

    12*(5000/(5000+10000));

    dans la calculette en mode scientific il faut deja calculer la valeur des deux composant et en faire la somme
    5000+10000 = 15000

    donc 12*(5000/15000)=4
    sur la calculette sa marche
    voila pourquoi j'ai décomposé ce calcul separément dans ma formule






    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    v, c, r1, r2, rt, rs: integer;
     
    begin
     
    v:= strtoint (edit1.Text);  ///////////////////     valeur  12
    c := strtoint (label11.Caption); //////////////    valeur 5000
    r1:= strtoint(edit3.text);   /////////////////       valeur 10000
    r2 := strtoint(edit4.Text);   /////////////////      valeur  5000
    rt:= r1+r2;                       /////////////////       calcul 5000 + 10000 = 15000 
     label15.Caption:= inttostr (rt);   //////////     affiche bien 15000 ok parfait
     
    rs:= v *c div rt;  ////////// retourne  4  ???????
     
    label12.Caption:= inttostr (rs; ///////////////    affiche bien 4 en résultat
    end;


    maintenant il faut que je puisse utiliséles virgules dans edit1 pour faire 13.8v dans mon calcul et avoir un resultat plus precis

    cordialement
    Alain







    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.


    Non, cela ne fait pas 4.

    La priorité est d'abord à ce qui se trouve entre les parenthèses.
    Puis à l'intérieur de celles-ci, la priorité est à la division.
    En décomposant, cela donne :
    --> 12 x ( 5000 / 10000 + 5000)
    --> 12 x ( 1/2 + 5000)
    --> 12 x 5000.5
    --> 60006

    Il suffit de copier ta formule et de la mettre dans la calculatrice de Windows.
    Après avoir copié, tu cliques sur le touche égale ("=") et tu verras le résultat apparaitre.

    Si tu veux que cela fasse 4, il faut ajouter un autre niveau de parenthèses :


    @+

  7. #7
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 68
    Par défaut
    bonsoir tourlourou,

    alors tres interessant cet fonction je m'était interesser a la fonction trunc mais sa equivaut a un round
    enfin sur les essais que j'ai fait , mon niveau est tres surement insuffisant bien entendu

    avec cet formule est ce que je vais reussir a utilisé les virgules dans edit1 ou il y as 12 pour le remplacer par 13.8
    actuelement j'arrive bien a avoir la valeur 4 a mon operation mais une erreur evidement si je place 13.8
    j'utilise strtoint mais pas le strtofloat !!!!!
    donc en fait j'ai bien résolut mon probleme de base pour affiché la bonne valeur mais je doit trouvé comment utilisé la virgule dans edit1 pour le calcul


    cordialement
    Alain





    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Selon le niveau de précision requis, utiliser la division entière peut ne pas être adéquat et mieux vaudrait utiliser des réels et la division entre eux puis garder la partie entière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function MonCalcul(v, c, r1, r2: integer): integer;
    var
      res: Extended;
    begin
      res := v * c / (r1 + r2);
     
      Result := Trunc(res); // affecte la partie entière du résultat du calcul comme valeur de retour de la fonction
    end;

  8. #8
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par alll1 Voir le message
    alors tres interessant cet fonction je m'était interesser a la fonction trunc mais sa equivaut a un round
    enfin sur les essais que j'ai fait , mon niveau est tres surement insuffisant bien entendu
    Non, Trunc et Round ne font pas la même chose.

    Trunc, vas tronquer la partie flottante sans autre forme de procès, et Round vas arrondir au plus proche !

    Exemple
    Trunc(1.1) = 1, Trunc(1.6) = 1
    Round(1.1) = 1, Round(1.6) = 2

    Tu peux aussi jeter un œil du côté des fonctions Floor et Ceil…

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 974
    Billets dans le blog
    6
    Par défaut
    Et Trunc renvoie un entier alors que Round renvoie un réel.
    Delphi 5 Pro - Delphi 12 Athènes Community Edition - CodeTyphon 8.80 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 68
    Par défaut
    bonjours informt2025,

    sa marche bien et j'obtient bien un résultat en chiffre rond mais si je veut un calcul plus juste je doit pouvoir utilisé la virgule dans mon edit1 ou dans v dans mon soft

    si j'utilise 12.8 par exemple sa ne fonctionne pas j'ai un message du compilateur me disant que econverterror signal "" n'est pas une valeur entier ""

    auriez vous une idée a me suggéré

    maintenant il faut que je puisse utilisé les virgules dans edit1 pour faire 13.8v dans mon calcul et avoir un résultat plus précis
    sur la calculette si je fait
    13.8*(5000/(5000+10000)=4.6 ce qui est parfait

    comment réalisé cette formule correctement !!!!!!!!!!!!

    mon code actuel est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    procédure TForm1.Button1Click(Sender: TObject);
    var
    v, c, r1, r2, rt, rs: integer;
     
    begin
     
    v:= strtoint (edit1.Text);  ///////////////////     valeur  12
    c := strtoint (label11.Caption); //////////////    valeur 5000
    r1:= strtoint(edit3.text);   /////////////////       valeur 10000
    r2 := strtoint(edit4.Text);   /////////////////      valeur  5000
    rt:= r1+r2;                       /////////////////       calcul 5000 + 10000 = 15000 
     label15.Caption:= inttostr (rt);   //////////     affiche bien 15000 ok parfait
     
    rs:= v *c div rt;  ////////// retourne  4  ???????
     
    label12.Caption:= inttostr (rs; ///////////////    affiche bien 4 en résultat
    end;


    cordialement
    Alain





    Citation Envoyé par Informt2025 Voir le message
    Bonjour,

    Le mot Val est utilisé en interne il faut éviter de l'utiliser comme nom de variable,
    Pour résoudre le problème il faut enlever les parenthèses pour garder la précision avec les opérations entier : v * c div rt
    lorsque on force (c div rt ) le résultat de ce facteur est fractionnel 5000/(10000+5000)=0.33 et nul comme résultat entier

  11. #11
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 100
    Par défaut
    Si tu veux un calcul plus précis avec des virgules change le type des variables vers Double :
    v, c, r1, r2, rt, rs: Double;

    Et replace les fonction de conversions:
    StrToInT par StrToFloat
    IntToStr par FloatToStr

    replace Div par /
    rs:= v *c / rt;

    Attention le séparateur décimal c'est le virgule sur pc français

  12. #12
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 68
    Par défaut
    bonsoir informt,

    voila j'ai suivie votre idée et oufff sa marche très bien affichage en virgule et même avec 2 décimal après la virgule


    pour le decimalseparator j'avait deja fait sa dans un autre prog j'ai juste recopier la fonction pour que quant j'appuie sur la virgule ou sur le point il affiche toujour la virgule dans mon edit1
    voici le code que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    v, c, r1, r2, rt,rs: double;
    res: tfloatrec;
     
    begin
    // but de cette formule : 12*(5000/10000+5000) = 4 /// 12*(5000/15000) = 4///////////////
     
    v:= strtofloat (edit1.Text);  ///////////////////     edit1.Text = 12
    c := strtofloat (label11.Caption); //////////////     valeur de 5000
    r1:= strtofloat(edit3.text);   /////////////////      valeur 10000
    r2 := strtofloat(edit4.Text);   /////////////////     valeur  5000
    rt:= r1+r2;
    label15.Caption:= floattostr (rt);   //////////     affice 15000 ok parfait
     
    rs:= v *c / rt;  ////////// retourne 4,6 impec
     
    label12.Caption := format('%2f',[rs]); ///////////////    affiche bien super sa marche
     
    end;
    et pour la virgule c'est sa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      If (Key =',') Or (Key ='.') Then
        Key:=DecimalSeparator;
    end;
    cordialement
    merci pour votre aide cette fois sa marche au poil




    Alain





    Citation Envoyé par Informt2025 Voir le message
    Si tu veux un calcul plus précis avec des virgules change le type des variables vers Double :
    v, c, r1, r2, rt, rs: Double;

    Et replace les fonction de conversions:
    StrToInT par StrToFloat
    IntToStr par FloatToStr

    replace Div par /
    rs:= v *c / rt;

    Attention le séparateur décimal c'est le virgule sur pc français

  13. #13
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 100
    Par défaut
    Tu peux aussi jeter un œil du côté des fonctions Floor et Ceil…
    Foor et Ceil sont un peu bizarre avec les valeurs négatives, elles doivent coresspendre à Round mais fonctionnant sur un seul coté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Valeur	-1,1	-1,6	1,1	1,6
    ------------------------------------------------
    Trunc	-1	-1	1	1
    Round	-1	-2	1	2
    Floor	-2	-2	1	1
    Ceil	-1	-1	2	2
    Normalement elles doivent renvoyer le tableau suivant mais il est possible d'avoir plusieurs versions comme le modulo float qu'on peut l'implémenter par 4 manières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Valeur	-1,1	-1,6	1,1	1,6
    ------------------------------------------------
    Round	-1	-2	1	2
    Floor	-1	-1	1	1
    Ceil	-2	-2	2	2

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/12/2006, 16h03
  2. Conseils pour serveur calculs de maths en C
    Par smithofmatrix dans le forum Réseau
    Réponses: 1
    Dernier message: 08/11/2006, 13h51
  3. fonction math : pow()
    Par uriotcea dans le forum C++Builder
    Réponses: 12
    Dernier message: 05/10/2006, 11h05
  4. coordonnées géométriques et fonctions maths
    Par passie dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/09/2006, 13h27
  5. aide fonction math[racine,cos(),sin(),..]VB6
    Par am.adnane dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/12/2005, 18h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo