Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1613 connectés 

  FORUM HardWare.fr
  Programmation

  arrondi [delphi]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

arrondi [delphi]

n°62044
endemyon
Posté le 28-09-2001 à 16:26:29  profilanswer
 

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

mood
Publicité
Posté le 28-09-2001 à 16:26:29  profilanswer
 

n°62045
rufo
Pas me confondre avec Lycos!
Posté le 28-09-2001 à 16:27:53  profilanswer
 

endemyon a écrit a écrit :

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




 
trounquer à 2 chiffres ou arrondir?

n°62046
endemyon
Posté le 28-09-2001 à 16:29:16  profilanswer
 

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

n°62047
rufo
Pas me confondre avec Lycos!
Posté le 28-09-2001 à 16:34:42  profilanswer
 

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
 
:)

n°62051
endemyon
Posté le 28-09-2001 à 16:52:19  profilanswer
 

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

n°62055
rufo
Pas me confondre avec Lycos!
Posté le 28-09-2001 à 17:17:30  profilanswer
 

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

n°62057
rufo
Pas me confondre avec Lycos!
Posté le 28-09-2001 à 17:20:24  profilanswer
 

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 ;

n°62058
rufo
Pas me confondre avec Lycos!
Posté le 28-09-2001 à 17:21:44  profilanswer
 

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

n°62062
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-09-2001 à 17:40:23  profilanswer
 

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
n°62065
endemyon
Posté le 28-09-2001 à 17:57:27  profilanswer
 

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.

mood
Publicité
Posté le 28-09-2001 à 17:57:27  profilanswer
 

n°62070
JPA
Posté le 28-09-2001 à 18:20:46  profilanswer
 

-> 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+

n°62092
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-09-2001 à 21:28:45  profilanswer
 

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
n°62097
rufo
Pas me confondre avec Lycos!
Posté le 28-09-2001 à 22:07:41  profilanswer
 

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 :)

n°62099
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-09-2001 à 22:17:51  profilanswer
 

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
n°62122
rufo
Pas me confondre avec Lycos!
Posté le 29-09-2001 à 08:57:33  profilanswer
 

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 '\'. :)

n°62124
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-09-2001 à 09:57:34  profilanswer
 

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
n°63412
AGA
La boîte à Bokeh!
Posté le 05-10-2001 à 11:25:50  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  arrondi [delphi]

 

Sujets relatifs
Création de thread en Delphi 4InstallShield livré avec Delphi 4
delphi ->performance ?!Cacher une application au maximum en Delphi ?
BDD Delphi FILTRES[VbA] Arrondi superieur à 0.1
[Delphi/COM+] Gestion des exceptions ...Débutant recherche aide (delphi)
[Delphi] enregistrer des lyrics dans un mp3Delphi: Besoin d'aide !
Plus de sujets relatifs à : arrondi [delphi]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR