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 :

Resultat d un calcul incomprehensible


Sujet :

Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut Resultat d un calcul incomprehensible
    Bonjour

    Je deviens fou face à un pb tout con.
    Je cherche a calculer un rendement à partir d une somme initiale et d un total de mises (pour un jeu)

    Pour calculer le rendement la logique voudrait que je fasse (somme+mises)*100/mises...

    alors voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    somme := 7416085;
      total_mises := 19869799;
      somme := somme + total_mises;
      pc_cs := somme / total_mises;
      pc_cs := pc_cs * 100;
      Memo_ME.lines.add(formatfloat('0.00', pc_cs));
      somme := somme * 100;
      pc_cs := somme / total_mises;
      Memo_ME.lines.add(formatfloat('0.00', pc_cs));
    et voici le resultat obtenu :

    137,32
    -78,83
    Le premier est correct et le second est ... n importe quoi.

    L un d entre vous pourrait il m expliquer cela pke là j avoue ça me rend dingue !!!

    D avance merci pour vos lumieres...

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    verifie les type de tes variables,tu as du mettre Somme en integer et non en extended !

    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
    var
      somme, total_mises, pc_cs : extended;
    begin
      somme       := 7416085;
      total_mises := 19869799;
     
      somme := somme + total_mises; // 27*285*884
      pc_cs := somme / total_mises; // 1,3732340221458707257179602068446
     
      pc_cs := pc_cs * 100; // 137,32340221458707257179602068446
      Memo_ME.lines.add(format('%.2f', [pc_cs])); // 137.32
     
      somme := somme * 100; // 2 728 588 400
      pc_cs := somme / total_mises; // 137,32340221458707257179602068446 
      Memo_ME.lines.add(format('%.2f', [pc_cs])); // 137.32
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Janvier 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut somme originale ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    somme := 7416085;
      total_mises := 19869799;
      somme := somme + total_mises;
      pc_cs := somme / total_mises;
      pc_cs := pc_cs * 100;
      Memo_ME.lines.add(formatfloat('0.00', pc_cs));
    
    ici tu ne repars pas du somme original  (7416085) mais de somme + total_mises
    c'est bien ce que tu veux dans le calcul qui suit ?
    
      somme := somme * 100;
      pc_cs := somme / total_mises;
      Memo_ME.lines.add(formatfloat('0.00', pc_cs));

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Non non Youdelf c'est normal, c'est uniquement du au probleme que Somme et Total_Mises ne sont pas dans le bon type (integer, au lieu de tout en extended)


    voici un test :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    program Project2;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils;
     
    var
      iSomme     : integer;
      iTotalMises: integer;
      dPc_cs1, dPc_cs2 : double;
     
      eSomme, eTotalMises, ePc_cs1, ePc_cs2: extended;
    begin
      // test 1
                  writeln('Test 1 (integer et double) :');
      iSomme      := 7416085;
      iTotalMises := 19869799;
                  writeln(format('  -> iSomme %d et iTotalMises %d',[iSomme, iTotalMises]));
     
      iSomme      := iSomme + iTotalMises;
                  writeln(format('  -> iSomme + iTotalMises = %d',[iSomme]));
     
      dPc_cs1     := iSomme / iTotalMises;
      dPc_cs1     := dPc_cs1 * 100;
     
      iSomme      := iSomme * 100;
                  writeln(format('  -> iSomme * 100 = %d',[iSomme]));
     
      dPc_cs2     := iSomme / iTotalMises;
                  writeln(format('Test1 = %.2f | %.2f',[dPc_cs1, dPc_cs2]));
     
      // Test 2
                  writeln(' -------------------------- ');
                  writeln('Test 2 (extended all) :');
      eSomme      := 7416085;
      eTotalMises := 19869799;
                  writeln(format('  -> eSomme %f et eTotalMises %.2f',[eSomme, eTotalMises]));
     
      eSomme      := eSomme + eTotalMises;
                  writeln(format('  -> eSomme + eTotalMises = %.2f',[eSomme]));
     
      ePc_cs1     := eSomme / eTotalMises;
      ePc_cs1     := ePc_cs1 * 100;
     
      eSomme      := eSomme * 100;
                  writeln(format('  -> eSomme * 100 = %.2f',[eSomme]));
     
      ePc_cs2     := eSomme / eTotalMises;
                  writeln(format('Test2 = %.2f | %.2f',[ePc_cs1, ePc_cs2]));
     
      readln;
    end.

    qui affiche bien l'erreur sur Test1 et pas sur Test2 :

    Test 1 (integer et double):
    -> iSomme 7416085 et iTotalMises 19869799
    -> iSomme + iTotalMises = 27285884
    -> iSomme * 100 = -1566378896
    Test1 = 137,32 | -78,83
    --------------------------
    Test 2 (extended all):
    -> eSomme 7416085.00 et eTotalMises 19869799.00
    -> eSomme + eTotalMises = 27285884.00
    -> eSomme * 100 = 2728588400.00
    Test2 = 137.32 | 137.32

    ou alors il faut réduire les expressions avec au moins pc_cs en extended et passer par une fonction pour forcer les types :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    program Project2;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils;
     
    function PcCs(aSomme, aTotalMises: extended; var vPcCs1, vPcCs2: extended): boolean;
    begin
      vPcCs1 := ((aSomme+aTotalMises)/aTotalMises) * 100;
      vPcCs2 := ((aSomme+aTotalMises)*100) / aTotalMises;
      result := round(vPcCs1*10000) = round(vPcCs2*10000);
    end;
     
    var
      Somme     : integer;
      TotalMises: integer;
      Pc_cs1, Pc_cs2 : extended;
    begin
      Somme      := 7416085;
      TotalMises := 19869799;
     
      if PcCs(somme, totalMises, Pc_cs1, Pc_cs2) then
        writeln(format('test OK    %.2f == %.2f',[Pc_cs1, Pc_cs2]))
      else
        writeln(format('test FAIL  %.2f != %.2f',[Pc_cs1, Pc_cs2]));
     
     
      readln;
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    Merci !

    C est exact, j avais somme et total_mises en integer. Avec un petit echantillon cela passait, je n ai pas envisagé tester des si larges echantillons initialement...

    je vais modifier cela

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 21/03/2014, 14h51
  2. [rave report 5.0] afficher le resultat d'un calcul
    Par webbulls dans le forum Bases de données
    Réponses: 10
    Dernier message: 16/07/2009, 12h14
  3. Ajouter une colonne à un fichier csv contenant les resultats d'un calcul
    Par Freedd dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 31/07/2008, 12h01
  4. resultat faux sur calcul de date
    Par debdba dans le forum SQL
    Réponses: 2
    Dernier message: 07/02/2008, 08h47
  5. Réponses: 4
    Dernier message: 26/08/2006, 02h01

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