arrondi [delphi]

arrondi [delphi] - Programmation

Marsh Posté le 28-09-2001 à 16:26:29    

Question de débutant : comment arrondir un nombre avec 2 chiffre apres la virgule?

Reply

Marsh Posté le 28-09-2001 à 16:26:29   

Reply

Marsh Posté le 28-09-2001 à 16:27:53    

endemyon a écrit a écrit :

Question de débutant : comment arrondir un nombre avec 2 chiffre apres la virgule?  




 
trounquer à 2 chiffres ou arrondir?

Reply

Marsh Posté le 28-09-2001 à 16:29:16    

Arrondir. C'est pour convertir des francs en euro et vis versa

Reply

Marsh Posté le 28-09-2001 à 16:34:42    

le mieux, c'est de passer par une chaine de caractères:
Chaine_Nombre := FloatToStr(Nombre) ;
 
ensuite
1) trouver la position de la virgule (',';)
2) séparer dans 2 chaines la partie entière et décimale
3) vérifier si le 3ème caractère après la virgule est > au caractère '5' (pour voir s'il faut arrondir)
4) dans le cas où on arrondi, vérifier s'il ne faut pas incrémenter la partie entière
5) concaténer les 2 chaines: Chaine_Ent + ',' + Chaine_Dec
6) StrToFloat du résultat pour avoir à nouveau un nombre...
 
si tu peux attendre qq heures, je te filerais une fct que j'avais faite pour arrondir aux 0.05 supérieur, ça pourra t'aider
ex: 2.23 -> 2.25
 
:)

Reply

Marsh Posté le 28-09-2001 à 16:52:19    

Il n'y a pas une fonction toute faite pour une chose aussi simple dans delphi?
Si non ta fonction m'interesse merci.

Reply

Marsh Posté le 28-09-2001 à 17:17:30    

endemyon a écrit a écrit :

Il n'y a pas une fonction toute faite pour une chose aussi simple dans delphi?
Si non ta fonction m'interesse merci.  




 
ça tombre bien, ma fonction c'est pour Frs->Euros :D

Reply

Marsh Posté le 28-09-2001 à 17:20:24    

function TF_Liste_Cocktails.Tronque(Valeur: Real):Real;
var
   Nombre, Decimal, Entier: string ;
   i: SmallInt ;
   Trouve: Boolean ;
begin
     // Ne garde que 2 chiffres après la virgule
     Nombre := FloatToStr(Valeur) ;
     i := 1 ;
     Trouve := False ;
     while (i <= Length(Nombre)) and (not Trouve) do
     begin
          // Rechercher de la virgule
          if (Nombre[i] = #44) or (Nombre[i] = #46) then
             Trouve := True ;
          Inc(i) ;
     end ;
 
     if Trouve then
     begin
          try
             Nombre := Copy(Nombre, 1, i+1) ;
             // Arondi au 0.05 supérieur
             Decimal := Copy(Nombre, i, 2) ;
             Entier := Copy(Nombre, 1, i-2) ;
             if Decimal[2] > #53 then
             begin
                  // dernière décimale supérieure à 5
                  Decimal[2] := #48 ; // 0
                  if Decimal[1] < #57 then
                     Decimal[1] := Succ(Decimal[1])  // on augmente d'un 10ème
                  else
                  begin
                       // passage à l'unité supérieure
                       Decimal[1] := #48 ; // 0
                       Entier := IntToStr(StrToInt(Entier) + 1) ;
                  end ;
             end
             else Decimal[2] := #53 ;
             Nombre := Entier + Nombre[i-1] + Decimal ;
          except
                Nombre := Copy(Nombre, 1, i)
          end ;
          Tronque := StrToFloat(Nombre) ;
     end
     else Tronque := Valeur ;
end ;

Reply

Marsh Posté le 28-09-2001 à 17:21:44    

voilà, normalement, tu peux la réutiliser tranquille (change juste l'en-tête :
 
function TF_Liste_Cocktails.Tronque(Valeur: Real):Real;

Reply

Marsh Posté le 28-09-2001 à 17:40:23    

faudrait peut-être penser à aller voir la fonction "Round" de Delphi...
si tu veux garder les deux dernières décimales, tu fais :
nombre_virgule := round(nombre_virgule*100)/100;
si tu veux pas garder les décimales:
nombre_entier := round(nombre_virgule);
Bon y a peut etre des conversions entier <-> flottant à faire mais c'est plus propre et rapide que de passer par des chaînes...
 

Citation :


Unit "System"
 
Category "arithmetic routines"
 
function Round(X: Extended): Int64;
 
Description
 
The Round function rounds a real-type value to an integer-type value.
 
X is a real-type expression. Round returns an Int64 value that is the value of X rounded to the nearest whole number. If X is exactly halfway between two whole numbers, the result is always the even number.
 
If the rounded value of X is not within the Int64 range, a run-time error is generated, which can be handled using the EInvalidOp exception.


 
 
Rufo: ton code est bizare et (sans vouloir te vexer) pas fort optimisé... déjà rien que pour le "while (i <= Length(Nombre)) and (not Trouve) do", tu sais qu'y a des fonctions pour trouver un caractère dans une chaîne (Pos, LastDelimiter, etc...)

 

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


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

Marsh Posté le 28-09-2001 à 17:57:27    

Jai vu une fonction RoundTo qui devrait convenir :
 
type TRoundToRange = -37..37;
function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
 
Description
 
Call RoundTo to round AValue to a specified power of ten.
 
AValue is the value to round.
 
ADigit indicates the power of ten to which you want AValue rounded. It can be any value from –37 to 37 (inclusive).
 
RoundTo uses “Banker’s Rounding” to determine how to round values that are exactly midway between the two values that have the desired number of significant digits. This method rounds to an even number in the case that AValue is not nearer to either value.
 
The following examples illustrate the use of RoundTo:  
 
Expression Value
 
RoundTo(1234567, 3) 1234000
RoundTo(1.234, -2) 1.23
RoundTo(1.235, -2) 1.24
RoundTo(1.245, -2) 1.24
 
Note: The behavior of RoundTo can be affected by the Set8087CW procedure or SetRoundMode function.
 
mais quand je l'utilise dans la ligne
temp:=RoundTo(StrToFloat(lbFrancs.Caption)/taux,-2);
j'obtiens une erreur à la compilation : undeclared identifier RoundTo.
Je comprends pas pourquoi.

Reply

Marsh Posté le 28-09-2001 à 17:57:27   

Reply

Marsh Posté le 28-09-2001 à 18:20:46    

-> antp  
ta solution me parait la plus simple (c'est celle que j'utilisait), mais j'ai un doute :
tu écris :
nombre_virgule := round(nombre_virgule*100)/100;  
or round transforme en integer (double je crois) => nombre_virgule deviendra un Integer (Entier divisé par entier).
Moi, j'écrirais :
nombre_virgule := round(nombre_virgule*100)/100.0;
 
Qu'en pense-tu ?
A+

Reply

Marsh Posté le 28-09-2001 à 21:28:45    

JPA a écrit a écrit :

 
Moi, j'écrirais :
nombre_virgule := round(nombre_virgule*100)/100.0;
 
Qu'en pense-tu ?
A+  




 
bien possible... je me fais souvent avoir avec ce genre de subtilités :D


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

Marsh Posté le 28-09-2001 à 22:07:41    

antp a écrit a écrit :

faudrait peut-être penser à aller voir la fonction "Round" de Delphi...
si tu veux garder les deux dernières décimales, tu fais :
nombre_virgule := round(nombre_virgule*100)/100;
si tu veux pas garder les décimales:
nombre_entier := round(nombre_virgule);
Bon y a peut etre des conversions entier <-> flottant à faire mais c'est plus propre et rapide que de passer par des chaînes...
 

Citation :


Unit "System"
 
Category "arithmetic routines"
 
function Round(X: Extended): Int64;
 
Description
 
The Round function rounds a real-type value to an integer-type value.
 
X is a real-type expression. Round returns an Int64 value that is the value of X rounded to the nearest whole number. If X is exactly halfway between two whole numbers, the result is always the even number.
 
If the rounded value of X is not within the Int64 range, a run-time error is generated, which can be handled using the EInvalidOp exception.


 
 
Rufo: ton code est bizare et (sans vouloir te vexer) pas fort optimisé... déjà rien que pour le "while (i <= Length(Nombre)) and (not Trouve) do", tu sais qu'y a des fonctions pour trouver un caractère dans une chaîne (Pos, LastDelimiter, etc...)  
 
 




 
oui, je le reconnais, c'est pas optimisé... Mais je connais aps toutes les fonctions en delphi :( merci pour tes remarques, j'en prends bonne note. On progresse toujours en faisant des erreurs :)

Reply

Marsh Posté le 28-09-2001 à 22:17:51    

rufo a écrit a écrit :

 
 
oui, je le reconnais, c'est pas optimisé... Mais je connais aps toutes les fonctions en delphi :( merci pour tes remarques, j'en prends bonne note. On progresse toujours en faisant des erreurs :)  




 
c'est bien vrai... je ne te montrerai pas ce que j'avais écrit comme fonction avant de découvrir "ExtractFilePath" par exemple ;)


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

Marsh Posté le 29-09-2001 à 08:57:33    

antp a écrit a écrit :

 
 
c'est bien vrai... je ne te montrerai pas ce que j'avais écrit comme fonction avant de découvrir "ExtractFilePath" par exemple ;)  




 
oh, j'imagine... tu partais de la fin de la chaine et tu recherchais le caractère '\'. :)

Reply

Marsh Posté le 29-09-2001 à 09:57:34    

rufo a écrit a écrit :

 
 
oh, j'imagine... tu partais de la fin de la chaine et tu recherchais le caractère '\'. :)  




 
en gros c'est ça :)
enfin après j'ai quand même utilisé la fonction LastDelimiter... Et puis heureusement j'ai trouvé extactFilePath.


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

Marsh Posté le 05-10-2001 à 11:25:50    

JPA a écrit a écrit :

 
 
Moi, j'écrirais :
nombre_virgule := round(nombre_virgule*100)/100.0;
 
Qu'en pense-tu ?
A+  




C du tout BON 10F = 1,52E :jap:


---------------
ma vie, ma carrière! - Un trait d’union entre des photos et des mots.
Reply

Sujets relatifs:

Leave a Replay

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