Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Débutant
Débutant Pour bien débuter avec Delphi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/01/2013, 23h29   #1
sp2308
Membre habitué
 
Inscription : décembre 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 337
Points : 112
Points : 112
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 :
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 :

Citation:
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...
sp2308 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2013, 03h48   #2
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
verifie les type de tes variables,tu as du mettre Somme en integer et non en extended !

Code :
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2013, 14h01   #3
YouDelf
Invité de passage
 
Homme robert dubanc
Rédacteur technique
Inscription : janvier 2013
Messages : 1
Détails du profil
Informations personnelles :
Nom : Homme robert dubanc
Localisation : France

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

Informations forums :
Inscription : janvier 2013
Messages : 1
Points : 2
Points : 2
Par défaut somme originale ?

Code :
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));
YouDelf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2013, 16h39   #4
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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 :
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 :

Citation:
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 :
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2013, 22h39   #5
sp2308
Membre habitué
 
Inscription : décembre 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 337
Points : 112
Points : 112
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
sp2308 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h08.


 
 
 
 
Partenaires

Hébergement Web