ioda19
Messages postés21Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention20 juin 2007
-
17 avril 2007 à 16:22
ioda19
Messages postés21Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention20 juin 2007
-
20 juin 2007 à 15:55
Salut j'ai une question a propos des formats monétaires. Mon problème n'est pas que je ne suis pas capable de faire un arrondissement ou précisé un format (0.00). Je voudrais savoir si une fonction existe déjà dans Delphi pour faire ce que je veux.
Je m'explique
J'ai un logiciel qui calcul des prix avec des pourcentages, montants de rabais, des profits etc.
Je voudrais faire un option qui permet d'arrondir à des formats de ¢.
Exemple : Dans ma fenêtre d'option j'ai les choix d'arrondissement suivant : Aucun, 0.05$, 0.10$, 0.25$, 0.99$, 1.00$
Ce que je voudrais faire c'est d'arrondir un nombre avec les choix
Nombre avant Choix Nombre après
12,4813 0.05$ 12,40$
12,5634 0.05$ 12,60$
12,5536 0.05$ 12,55$
ioda19
Messages postés21Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention20 juin 2007 20 juin 2007 à 15:55
En fin de compte ça marche pas pentoute
j'ai fais ça a la place et ça marche pour tout les type d'arrondisement soit à la hausse ou a la baisse
function RoundMoney(const aNumber, aRoundType : Double) : Double;
var
lCalcul : Double;
lTempNumber : Double;
lRoundValue : Double;
begin
Result := aNumber;
if aRoundType > 0 then
begin
lTempNumber := aNumber;
if aNumber < 0 then
lTempNumber := lTempNumber * -1;
lCalcul := Frac(lTempNumber) / aRoundType;
//LAISSER ABSOLUMENT CETTE LIGNE
//Je suis obliger de faire ça parce que des fois ça marche pas
//EXEMPLE : Frac(0.15) / 0.05 = (lCalcul est alors égal à 3);
// Trunc(lCalcul) devrais donner 3 mais dans ce cas ça donne 2 fouillez moi pourquoi mais j'ai pas encore compris
lCalcul := StrToFloat(FloatToStr(lCalcul));
if Frac(lCalcul) > 0 then
begin
lRoundValue := (Trunc(lCalcul) + 1) * aRoundType;
Result := Trunc(lTempNumber) + lRoundValue;
if aNumber < 0 then
Result := Result - aRoundType;
end;
if aNumber < 0 then
Result := Result * -1;
end;
end;
ioda19
Messages postés21Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention20 juin 2007 17 avril 2007 à 16:25
Oups j'me suis tompé dans mon arrondissements de 0.05$
Nombre avant Choix Nombre après
12,4813 0.05$ 12,50$
12,5634 0.05$ 12,60$
12,5536 0.05$ 12,55$
12,4318 0.05$ 12,40$
ioda19
Messages postés21Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention20 juin 2007 24 avril 2007 à 14:38
Salut WhitHippo et merci de ta réponse. Ça fonctionne à moitier. Je t'explique
Quand je passe en paremètre "Choix" et que sa valeur est comprise entre 0.01 et 0.50 ça fonction très bien pour les arrondissements. Sauf que si je dépasse 0.51 ça ne marche pas très bien
Exemple avec une arrondissement de "0.99"
67.876 devrais donné 67.99 mais ça me donne 68.31
84.107 devrais donné 84.99 mais ça me donne 84.15
Je ne comprend pas trop pourquoi j'ai l'impression qu'il faudrais mettre une condition dans la formule
if choix > 0.5 then
.......
Mais je ne suis pas vraiment la bol des maths
Je vais travaillé la dessus et je redonne des nouvelles, si jamais tu as de quoi tu me le diras
Vous n’avez pas trouvé la réponse que vous recherchez ?
ioda19
Messages postés21Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention20 juin 2007 24 avril 2007 à 14:50
ÇA Y EST
après avoir envoyé mon message je me suis penché sur le sujet et la réponse m'est venu comme ça
j'ai modifier la fonction d'arrondissement à la hause (parce que c'est d'elle que j'avais de besoin)
voici ma petite modif qui fonctionne très bien
function TForm1.BankRound(const aNombre, aChoix : Extended) : Extended;
var
lSubstract : Double;
begin
if Frac(aChoix) > 0.5 then
begin
lSubstract := 1 - aChoix;
Result := 1 * (Int((aNombre + 1) / 1));
Result := Result - lSubstract;
end
else
Result := aChoix * (Int((aNombre + aChoix) / aChoix));
end;
En fais quand les décimals sont plus grand que 0.50, je trouve le différence avec 1, d'où "1- aChoix"
Ensuite j'arrondis le nombre avec 1 et je soustrais le différence.
De ce que j'ai pu tester, tous fonctionne sans faute
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 24 avril 2007 à 15:57
Pour info ioda19, les formules d'arrondi fournies correspondent aux arrondis inférieur et supérieur d'un nombre au multiple spécifié, d'où les différences de résultats avec ce que tu espérais. Valeur Multiple Valeur arrondie
18.567 0.99 18.81 = 19 x 0.99
12.457 0.99 12.87 = 13 x 0.99
18.567 0.13 18.59 = 143 x 0.13
12.457 0.13 12.48 = 96 x 0.13
18.567 0.05 18.55 = 371 x 0.05
12.457 0.05 12.45 = 249 x 0.05
Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein