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

 


Dernière réponse
Sujet : arrondi [delphi]
AGA

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:


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
AGA

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:

antp

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.

rufo

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

antp

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

rufo

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

antp

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

JPA -> 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+
endemyon 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.
antp 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]

rufo voilà, normalement, tu peux la réutiliser tranquille (change juste l'en-tête :
 
function TF_Liste_Cocktails.Tronque(Valeur: Real):Real;
rufo 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 ;
rufo

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

endemyon Il n'y a pas une fonction toute faite pour une chose aussi simple dans delphi?
Si non ta fonction m'interesse merci.
rufo 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
 
:)
endemyon Arrondir. C'est pour convertir des francs en euro et vis versa
rufo

endemyon a écrit a écrit :

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




 
trounquer à 2 chiffres ou arrondir?

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

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)