[DELPHI] Fonction "Round" donne un résultat bizarre...

Fonction "Round" donne un résultat bizarre... [DELPHI] - Programmation

Marsh Posté le 05-03-2002 à 20:23:12    

Salut,
 
Si je fais un round d'une numérique valant 2.5, j'obtiens 2 et non 3 comme je le souhaiterais et comme ça semblerait logique (en tous cas dans la logique de l'arrondi financier)...
 
En fait, lorsque Delphi arrondi une valeur se trouvant exactement entre deux entiers, le résultat est toujours le nombre pair, allez donc savoir pourquoi :/
 
Dois-je me palucher l'arrondi à la mimine ou y-a-t'il un moyen de contourner ce problème afin d'obtenir un nombre arrondi correctement ?
 
Merci
A+


---------------
Nous ne sommes rien, nous n'allons vers rien. Profitons au moins du voyage !
Reply

Marsh Posté le 05-03-2002 à 20:23:12   

Reply

Marsh Posté le 05-03-2002 à 20:32:02    

heu, en delphi, la fonction round accepte un argument je crois (nb de décimales)
tu devrai tenter de mettre cet argument a 0

Reply

Marsh Posté le 05-03-2002 à 20:40:20    

Non, round n'accepte malheureusement aucun argument.
il arrondi à 0 décimales, mais un peu n'importe comment...


---------------
Nous ne sommes rien, nous n'allons vers rien. Profitons au moins du voyage !
Reply

Marsh Posté le 05-03-2002 à 21:34:12    

l'arrondi est logique
c'est l'arrondi "scientifique" et non monétaire.
Si decimale < .5 alors entier inferieur
Sinon si decimale > .5 alors entier superieur
Sinon si entier inferieur pair alors entier inferieur
Sinon entier superieur
 
c'est expliqué mieux que ça dans l'aide :D
 
pour ce que tu sembles vouloir, tu dois utiliser la fonction SimpleRoundTo je crois (n'existe que dans Delphi 6)

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-03-2002 à 21:48:21    

antp a écrit a écrit :

l'arrondi est logique
c'est l'arrondi "scientifique" et non monétaire.
Si decimale < .5 alors entier inferieur
Sinon si decimale > .5 alors entier superieur
Sinon si entier inferieur pair alors entier inferieur
Sinon entier superieur
 
c'est expliqué mieux que ça dans l'aide :D
 
pour ce que tu sembles vouloir, tu dois utiliser la fonction SimpleRoundTo je crois (n'existe que dans Delphi 6)  
 
 




 
Merci pour ces explications, pour mon cas personnel je cherche à appliquer l'arrondi comptable et non l'arrondi scientifique, donc je l'ai dans le cul...
 
Et comme je suis sous Delphi 5 je l'ai une deuxième fois dans le cul :crazy:
 
Bon ben j'vais m'faire une fonction d'arrondi alors :/


---------------
Nous ne sommes rien, nous n'allons vers rien. Profitons au moins du voyage !
Reply

Marsh Posté le 06-03-2002 à 09:57:09    

Bon ben voilà, j'ai fait comme ça :
 

Code :
  1. fonction Arrondi(NumeriqueEnChaine : String) : Longint ;
  2. var
  3.    PartieEntiere, PartieDecimale : String ;
  4.    i : Integer ;
  5. begin
  6. PartieEntiere := Copy(NumeriqueEnChaine, 1, (pos(DecimalSeparator, MaNumeriqueEnChaine) -1)) ;
  7. PartieDecimale := Copy(NumeriqueEnChaine, (pos(DecimalSeparator, MaNumeriqueEnChaine) +1), 2) ;
  8. i := StrToInt(PartieDecimale) ;
  9. Result := StrToInt(PartieEntiere) ;
  10. if i >= 50 then
  11.     Result := Result + 1 ;
  12. end;


 
Y avait peut-etre plus simple, mais bon ça marche :D


---------------
Nous ne sommes rien, nous n'allons vers rien. Profitons au moins du voyage !
Reply

Marsh Posté le 06-03-2002 à 10:06:31    

je crois qu'il y a plus simple et plus propre :/
 
ex de la fonction que j'ai dû faire pour un programme en Delphi 5 qui avait des problèmes d'arrondis et qui ne voulais pas compiler en Delphi 6 :

Code :
  1. type
  2.   TRoundToSERange = -37..37;
  3. function RoundToSE(const AValue: Double; const ADigit: TRoundToSERange = -2): Double;
  4. var
  5.   LFactor: Double;
  6. begin
  7.   LFactor := IntPower(10, ADigit);
  8.   if AValue > 0 then
  9.     Result := Trunc((AValue / LFactor) + 0.5) * LFactor
  10.   else if AValue < 0 then
  11.     Result := Trunc((AValue / LFactor) - 0.5) * LFactor
  12.   else
  13.     Result := 0;
  14. end;


 
(inspiré de la fonction SimpleRoundTo ou RoundTo, je sais plus, de Delphi 6
 
le second paramètre donne le nombre de chiffres à garder après la virgule.

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 06-03-2002 à 10:39:18    

Ben là tu peux utiliser ta fonction pour arrondir au nombre de décimales que tu veux, effectivement dans ce cas ta fonction est très pertinente.
 
Moi mon cas est très simple : J'ai un montant à 0 décimales en Euros, je veux le convertir en un montant à 0 décimales en dollar.
 
Je n'ai nul besoin, DANS LE CADRE PRECIS DE CETTE APPLI DE GESTION, de préciser le nombre de décimales, il sera TOUJOURS égal à 0 ;)
 
Ceci étant dit, avec ta permission, je conserve ton idée d'arrondi dans un coin de mes archives ;)
 
A+


---------------
Nous ne sommes rien, nous n'allons vers rien. Profitons au moins du voyage !
Reply

Marsh Posté le 06-03-2002 à 11:02:10    

bhen mon idée d'arrondi vient du source des fonctions de Delphi 6 donc il ne m'appartient pas vraiment :D
enfin je l'ai quand même modifié pcq y avait un bug avec les nombres négatif, et l'arrondi ne se faisait pas exactement comme il fallait le faire avec l'Euro :/


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed