IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Comment effectuer un arrondi


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 82
    Points : 56
    Points
    56
    Par défaut Comment effectuer un arrondi
    Merci encore pour vous différentes aides sur mes demandes.

    Je vous solicite pour un truc tout con, mais que je ne connais point.
    Voilà un code que j'ai créé pour le calcul d'un prix net. J'aimerais pouvoir faire un arrondi inférieur à 2 chiffres de ce dit calcul. Merci d'avance pour la syntaxe que je dois utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
     Result := FALSE;
     prixNet.Value := montantPrevu.Value / quantite.Value ;
     
    end;

  2. #2
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Salut,

    [...] J'aimerais pouvoir faire un arrondi inférieur à 2 chiffres [...]


    Je te propose le principe suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewValue := FormatFloat('#,##0.00', StrToFloat(prixNet.Value));
    @+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 82
    Points : 56
    Points
    56
    Par défaut
    Merci Droïde pour ta réponse.

    Est-ce que simplement je peux concatener ce que tu m'as mis avec ma formule initiale de sorte à avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prixNet.Value := FormatFloat('#,##0.00', StrToFloat(montantPrevu.Value / quantite.Value))
    D'ailleurs je viens de faire le test, mais l'arrondi qu'il me fait est en supérieur !!! donc ça me va pas trop ... faut vraiment que je puisse faire arrondi inférieur.

    Merci encore ...

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Ou comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    uses Math;
     
    begin
      // ...
      prixNet.Value := SimpleRoundTo(montantPrevu.Value / quantite.Value);
      // ...
    end;
    @+ Claudius

  5. #5
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par zpliz Voir le message
    D'ailleurs je viens de faire le test, mais l'arrondi qu'il me fait est en supérieur !!! donc ça me va pas trop ... faut vraiment que je puisse faire arrondi inférieur.
    Il me semble en effet qu'aucune des deux solutions apportées ne coïncident avec ton pb d'arrondi INFERIEUR...

    C'est ce qui me turlupine dans cette histoire.

    Dans l'aide ils semblent indiquer que roundTo et simpleRoundTo arrondissent au supérieur...


  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 82
    Points : 56
    Points
    56
    Par défaut Tronquage ???
    Y aurait-il du coup une formule qui me permettrait de tronquer ma valeur ?
    au final ça reviendrait au même que de faire un arrondi inférieur ...

  7. #7
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par zpliz Voir le message
    Y aurait-il du coup une formule qui me permettrait de tronquer ma valeur ?
    au final ça reviendrait au même que de faire un arrondi inférieur ...
    Ha ben oui effectivement on l'attaquer par là.

    Avec 32.28865 par ex:

    - d'abord récupérer la partie décimale (0.28865 par ex)
    - la multiplier par 100 (28.865)
    - ne garder que la partie entière (28)
    - puis la diviser par 100 (0.28)
    - et l'ajouter à la partie entière initiale (32 + 0.28 = 32.28).

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par peter27x Voir le message
    Dans l'aide ils semblent indiquer que roundTo et simpleRoundTo arrondissent au supérieur...
    SimpleRoundTo utilise "l'arrondi de banque".

    Quant à RoundTo tu peux préciser le type de l'arrondi avec la fonction SetRoundMode. (rmNearest, rmDown, rmUp, rmTruncate).

  9. #9
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Peut-être une autre solution:

    - multiplier ta valeur par -1
    - faire l'arrondi avec simpleRoundTo comme indiqué par Claudius
    - multiplier le résultat de nouveau par -1

    Comme la valeur est négative, l'arrondi "supérieur" par défaut de la fonction devient finalement un arrondi "inférieur" pour nous tu vois le truc ?

    Car -2.288 arrondi au supérieur donne -2.28 et non -2.29 ...

  10. #10
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    SimpleRoundTo utilise "l'arrondi de banque".

    Quant à RoundTo tu peux préciser le type de l'arrondi avec la fonction SetRoundMode. (rmNearest, rmDown, rmUp, rmTruncate).
    Ha bon ben voilà tout est réglé !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 82
    Points : 56
    Points
    56
    Par défaut Merci
    Bon j'ai opté pour la version "biceps" en faisant un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prixNet.Value := Int(montantPrevu.Value / quantite.Value)+ Int(Frac(montantPrevu.Value / quantite.Value)*100)/100
    Je dois pas avoir un vrai Delphi ou un vrai Pascal, parce qu'il reconnait pas les formules Round machin et SetMode ...

    Donc autant y aller en costaud !!! Mais merci à tous !!!

  12. #12
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par zpliz Voir le message

    Je dois pas avoir un vrai Delphi ou un vrai Pascal, parce qu'il reconnait pas les formules Round machin et SetMode ...
    As-tu ajouté l'unité Math dans tes uses comme dans mon précédent exemple ?

  13. #13
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    As-tu ajouté l'unité Math dans tes uses comme dans mon précédent exemple ?
    Exact, Spliz, lorsque tu as comme ça des fonctions que ton compilateur ne semble pas "connaitre" c'est parce qu'il faut que tu ajoutes l'unité (fichier .pas) qui les contient dans la commande "uses" (celle après la commande "implementation", et non pas celle avant).

    Par ex. ici avec l'unité math.pas, tu dois ajouter "math" dans le uses.

    Si on te donne parfois des fonctions (comme ici RoundTo, etc...) et que tu ne connais pas le nom de leur unité, c'est simple, tu écris le nom de la fonction dans ton éditeur Delphi, puis tu te mets dessus et tu fais F1, ainsi Delphi ouvrira l'aide correspondante, avec au début le nom de l'unité !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/09/2005, 11h04
  2. Réponses: 5
    Dernier message: 06/09/2005, 16h01
  3. Réponses: 6
    Dernier message: 24/03/2005, 14h29
  4. Comment effectuer un retour chariot dans 1 JTextarea
    Par elitost dans le forum Composants
    Réponses: 2
    Dernier message: 21/06/2004, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo