arrondi [delphi] - Programmation
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?
Marsh Posté le 28-09-2001 à 16:29:16
Arrondir. C'est pour convertir des francs en euro et vis versa
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
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.
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
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 ;
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;
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 : |
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]
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.
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+
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
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...
|
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
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
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 '\'.
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.
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
Marsh Posté le 28-09-2001 à 16:26:29
Question de débutant : comment arrondir un nombre avec 2 chiffre apres la virgule?