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 :

Utilisation de l'arrondi sur un calcul


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut Utilisation de l'arrondi sur un calcul
    salut
    je voudrez savoir l'utilisation du arrondi sous delphi
    voila un exemple pour mieux comprendre
    jais une multiplication de 35.1*0.125 le résultat est 4.3875
    si je utilise formatfloat('0.000',resultas) le resultas sera 4.388
    ya pas une fonction d'arrondi pour que le resultas sera 4.387
    merci d'avance

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Salut,

    Une solution est de passer par les entiers.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
    x : double;
    i : integer;
    begin
      x := 4.3875;
      i := trunc(x*1000);
      x := floattostr(i/1000);
     
    ==> x = 4.387;

  3. #3
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    En fait tu veux
    - soit un arrondi "vers le bas" : tu peux utilisé Math.RoundTo ou Format() après affecté la constante rmDown comme mode d'arrondi :
    - soit une troncature : tu peux utilisé Math.RoundTo ou Format() après affecté la constante rmTruncate comme mode d'arrondi :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    procedure AfficherArrondiVersLeBas;
    var
      oldRoundingMode : TFPURoundingMode;
    begin
      oldRoundingMode := GetRoundingMode; // sauvegarder le mode actuel (rmNearest par défaut)
     
    // option 1 :  
      SetRoundMode(rmDown); 
    // option 2 :
      SetRoundMode(rmTruncate);
     
      Showmessage (Format('%.3n', [4.3875]);
     
      SetRoundMode(oldRoundingMode); // restaure le mode par défaut
    end;
    [Edit] Il y a des différences pour les nombres négatifs entre RoundTo et Format avec l'option rmDown = "vers moins l'infini" !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Il existe aussi Floor et Ceil

    il faut savoir qu'en réalité, cela utilise la méthode d'AlfredKr, cela multiplie puis divise par la puissance indiqué en paramètre ADigit !

    Que donne SimpleRoundTo à la place RoundTo ?

    il est facile d'écrire une TruncTo en s'inspirant de RoundTo de l'unité Math (Delphi 6)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function TruncTo(const AValue: Double; const ADigit: TRoundToRange): Double;
    var
      LFactor: Double;
    begin
      LFactor := IntPower(10, ADigit);
      Result := Trunc(AValue / LFactor) * LFactor;
    end;
    Il faut savoir que Delphi XE inclu maintenant les variantes issu de FastCode, le code est nettement plus long mais plus rapide, il est de même très facile de reprendre le code de RoundTo et d'ajouter un paramètre RoundMode, puisque justement RoundTo version FastCode appel SetRoundMode !

  5. #5
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Il existe aussi Floor et Ceil
    Floor et Ceil ne répondent pas à la question posée par kroma23 puisque renvoient toujours un integer et non un nombre tronqué (et non arrondi) à une puissance de 10 donnée.

    Citation Envoyé par ShaiLeTroll Voir le message
    Que donne SimpleRoundTo à la place RoundTo ?
    Il y a une différence entre
    • SimpleRoundTo qui renvoie la valeur la plus proche ayant la puissance de dix spécifiée. Dans le cas où AValue se situe exactement au milieu des deux valeurs les plus proches ayant la puissance de dix spécifiée (au-dessus et en dessous), cette fonction renvoie : la valeur vers plus l'infini si AValue est positif / la valeur vers moins l'infini si AValue est négatif.

    • RoundTo qui utilise l'arrondi "de banque" pour déterminer comment arrondir la valeur qui se trouve exactement au milieu des deux valeurs ayant le nombre de chiffres significatifs souhaité. Cette méthode arrondit à un nombre pair dans le cas où AValue n'est pas plus proche d'une des deux valeurs.


    d'où :
    SimpleRoundTo(1.234, -2) --> 1.23
    SimpleRoundTo(1.235, -2) --> 1.24
    SimpleRoundTo(1.245, -2) --> 1.25

    RoundTo(1.234, -2) --> 1.23
    RoundTo(1.235, -2) --> 1.24
    RoundTo(1.245, -2) --> 1.24

    Ceci dit, par erreur, j'avais indiqué que Format était sensible au mode d'arrondi mais seul RoundTo l'est !

  6. #6
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut
    Merci tout le monde
    oui archonte ces ca ce que je veux ROUNDTO fais la faire.

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

Discussions similaires

  1. [WD17] Calcul et arrondi sur les durées
    Par meganulos dans le forum WinDev
    Réponses: 11
    Dernier message: 20/11/2012, 17h04
  2. [Math]Problème troncage ou arrondi sur des valeurs
    Par Carrel dans le forum Général Java
    Réponses: 6
    Dernier message: 07/10/2009, 15h11
  3. Problème d'arrondi sur calcul validité IBAN
    Par fusuke dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 25/06/2009, 11h55
  4. Problème d'arrondi sur un champ (âge) calculé
    Par fanico11 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/05/2008, 15h25
  5. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23

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