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 :

(Xe2) Comment avoir 3 decimales apres le point


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 391
    Points : 189
    Points
    189
    Par défaut (Xe2) Comment avoir 3 decimales apres le point
    Bonjour

    Je suis a la recherche de la meilleur methode pour avoir 3 decimales apres le point sans tenir compte de la 4 eme decimale.

    Voici mon probleme

    J'ai un nombre = 4.536 je lui ajoute une majoration de 10% ce qui donne 4.9896 je desires avoir comme information 4.989 mais j'ai 4.99 comme calcul.

    Qu'elle est la meilleur methode pour avoir les 3 chiffres apres le point sans tenir compte de la 4 eme decimale.

    Note: dans mon champ je l'ai defini a 3 decimale.

    Merci

    Mario

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 451
    Points
    15 451
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Je n'ai pas trouvé de fonction déjà existante. Voici ma proposition. S'il y a mieux, les experts le diront.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils;
     
    function TruncFloat(const number: extended; const decimals: integer): extended;
    var
      i: integer;
      p: integer; // puissance de 10
    begin
      p := 10;
      for i := 2 to decimals do
        p := 10 * p;
     
      i := Trunc(p*number);
     
      Result := i / p;
    end;
     
    begin
      WriteLn(TruncFloat(4.9896, 3)); // 4.989
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    On peut également utiliser la fonction "Floor" de l'unité Math de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uses Math,...
     
    Result := floor(x*1000)/1000;
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  4. #4
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut
    Bonjour :

    Votre question n'est pas précise.

    Avec votre champ vous faites un calcul. avec des flottants (Double, ...).
    Si vous voulez afficher le résultat vous avez la routine FloatToStrF pour avoir 3 décimales, entre autre.

  5. #5
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par Pascal Jankowski Voir le message
    On peut également utiliser la fonction "Floor" de l'unité Math de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uses Math,...
     
    Result := floor(x*1000)/1000;
    Salut, je crois que l'usage de Trunc pourra résoudre le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    writeln(FloatToStr(Trunc(4.99521472*1000)/1000));
    --> ça donne 4.995. Un Trunc permet de tronquer n'importe quel valeur non pas obtenir le plus grand entier inférieur ou égal à X ( le paramètre) comme pour Floor , mais pour avoir une valeur entière d'un réel. Ensuite, diviser pour obtenir la précision souhaitée .

    Bye
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par Moez.B Voir le message
    --> ça donne 4.995. Un Trunc permet de tronquer n'importe quel valeur non pas obtenir le plus grand entier inférieur ou égal à X ( le paramètre) comme pour Floor , mais pour avoir une valeur entière d'un réel. Ensuite, diviser pour obtenir la précision souhaitée .

    Bye


    L'avantage de Floor par rapport au Trunc réside dans le fait que la relation d'ordre sur un ensemble (entier, réel...) est conservée. Ce qui est en général conforme aux transformations utilisées pour modéliser la majeure partie des problèmes que l’on retrouve dans notre boulot.

    Pour tout problème où l’ensemble des données à traiter en entrée se situe dans un ensemble E = {X ; X >= 0} on peut utiliser indifféremment Trunc ou Floor.

    En revanche pour l’ensemble F = E U {X ; X < 0}, il faut effectivement privilégier la fonction Floor qui permet encore de comparer deux nombres X et Y appartenant à F, même si X < 0 et Y < 0.
    En effet Floor(-3.51*10)/10 = -3.6 où -3.51>-3.6 tandis que Trunc(-3.51*10)/10 = -3.5 avec -3.51 < -3.5

    Ce qui permet de conserver au mieux les règles algébriques.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  7. #7
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par Pascal Jankowski Voir le message

    L'avantage de Floor par rapport au Trunc réside dans le fait que la relation d'ordre sur un ensemble (entier, réel...) est conservée. Ce qui est en général conforme aux transformations utilisées pour modéliser la majeure partie des problèmes que l’on retrouve dans notre boulot.

    Pour tout problème où l’ensemble des données à traiter en entrée se situe dans un ensemble E = {X ; X >= 0} on peut utiliser indifféremment Trunc ou Floor.

    En revanche pour l’ensemble F = E U {X ; X < 0}, il faut effectivement privilégier la fonction Floor qui permet encore de comparer deux nombres X et Y appartenant à F, même si X < 0 et Y < 0.
    En effet Floor(-3.51*10)/10 = -3.6 où -3.51>-3.6 tandis que Trunc(-3.51*10)/10 = -3.5 avec -3.51 < -3.5

    Ce qui permet de conserver au mieux les règles algébriques.
    Bonne leçon algébrique et t'as parfaitement raison !
    Je suis parti sur l'exemple de @mario9 qui a précisé comme information qu'il va majorer de 10%, donc je suis vite allé dans un sens de montant ( qui ne peuvent pas être négatif bien sur ). Si mon intuition est juste alors Trunc fait l'affaire .. sinon, Floor résout le cas générique ..
    Merci Pascal pour toute l'explication !
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  8. #8
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 391
    Points : 189
    Points
    189
    Par défaut Super explication
    Bonjour

    Merci de vos réponses elles sont tres utiles dans la solution de mon probleme
    et tres bien expliqué.

    J'ai utilisé la commande Floor qui me donne le résultat désiré.
    valeur utilisé 4,536 +10%
    calcul:= floor((Table.fieldbyname('Taux_NORMAL').asfloat*1.10)*1000)/1000;

    ce qui me donne exactement la valeur désiré soit 4,989


    Merci a tous

    Mario

  9. #9
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Salut,
    Donc, mon intuition est juste, tu travaille avec un numérique positif.
    Tant que ça marche, on ne change pas une équipe qui gagne !
    Bye
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    sinon tu as RoundTo (+SetRoundMode si tu veux la valeur inferieure) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetRoundMode(rmDown);
    calcul:= RoundTo((Table.fieldbyname('Taux_NORMAL').asfloat*1.10), -3);

  11. #11
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    sinon tu as RoundTo (+SetRoundMode si tu veux la valeur inferieure) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetRoundMode(rmDown);
    calcul:= RoundTo((Table.fieldbyname('Taux_NORMAL').asfloat*1.10), -3);
    Salut, j'ai voulu tester le RoundTo, pour cet exemple ça donne 4.257, ce qui n'est pas la chose demandée.
    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
    16
    17
    18
    19
    20
     
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils, System.Math;
     
    begin
      try
        SetRoundMode(rmDown);
        Writeln(FloatToStr(RoundTo(4.256712, -3)));
        Readln;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    Une explication ??
    Bye
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 846
    Points
    24 846
    Par défaut
    On a déjà eu ce débat :
    problème avec RoundTo (Delphi Xe3)
    roundto simperoundto currency arrondi incorrect
    FloatToStrF et Chiffres significatifs
    Arrondi classique vs Arrondi bancaire
    Cela revient tout le temps !

    SetRoundMode impact Round et SimpleRoundTo mais PAS RoundTo !
    La 1ere instruction de RoundTo est de passé en rmNearest (puis restauré à la valeur en cours via un finally évidemment) !
    Suffisait de lire le code de Math.pas ! ainsi que la documentation :
    Remarque : RoundTo utilise l'arrondi "de banque"
    Remarque : Le résultat de cette fonction (SimpleRoundTo) dépend du mode d'arrondi en cours de la FPU. Vous pouvez modifier le mode d'arrondi de la FPU avec la fonction SetRoundMode.
    Remarque : Le comportement de Round peut être affecté par la procédure Set8087CW ou la fonction System.Math.SetRoundMode.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    SetRoundMode impact Round et SimpleRoundTo mais PAS RoundTo !
    La 1ere instruction de RoundTo est de passé en rmNearest (puis restauré à la valeur en cours via un finally évidemment) !
    Suffisait de lire le code de Math.pas ! ainsi que la documentation :
    oups, je me suis fié a la documentation de delphi 7 :
    Citation Envoyé par d7.hlp
    Remarque*: Le comportement de RoundTo peut être affecté par la procédure Set8087CW ou la fonction SetRoundMode.

  14. #14
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    ... et si j'avais lu la 1ere ligne de cette meme page d'aide :
    Arrondit une valeur en virgule flottante au nombre de chiffres, ou puissance de dix, spécifié, en utilisant "l'arrondi de banque".

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 846
    Points
    24 846
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    oups, je me suis fié a la documentation de delphi 7 :
    Il est tout à fait possible que :
    - c'était le cas en D7
    - l'aide soit fausse !

    En D7, on avait des erreurs de traduction, une négation qui ne l'était plus, ou un retour -1, 0, 1 devenant 1, 0, -1 sur CompareText par exemple

    Moi, je préfère vérifier le code, j'ai exploré SysUtils.pas et Classes.pas de long en large, j'ai eu plusieurs fois des mauvaises surprises en me fiant aveuglément à l'aide de D7 ou D6, selon la version, les erreurs dans la doc n'était pas les mêmes, quand deux documentations se contredisent, cela force à se méfier !

    Sans parler des fonctions cachées !
    Documentés souvent sur la version N+1, le temps de corriger les bugs surement avant d'officialiser une fonction

    Pour les fonctions d'arrondis, elles ont en plus été changé pour des algos plus rapide, RoundTo de XE2 est en réalité celle de Fastcode, donc possible que le SetRoundMode soit ignoré est un sacrifice au profit des perfs !
    Comme je le disais, on peut se faire sa MyRoundTo en reprenant le code de Math.pas de D7

    on en revient au différente proposition de multiplication\division (avec les risques d'erreur d'arrondi qui vont avec) en reprenant le code de D6 pour faire un TruncTo :

    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;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  16. #16
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    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;
    Salut,
    faut-il inverser les signes ? comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Result := Trunc(AValue * LFactor) / LFactor;
    sinon, si on fait un petit tournage à la main:
    TruncTo(4.25687, 3) --> Trunc(4.25687/1000)*1000 --> Trunc(0.00425687)*1000 --> 0 *1000 --> 0
    Bye
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  17. #17
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 846
    Points
    24 846
    Par défaut
    Citation Envoyé par Moez.B Voir le message
    faut-il inverser les signes ? comme ça:
    Il faut inverse le signe du paramètre TRoundToRange, c'est négatif pour les nombres après la virgule
    Les opérateurs / et * sont organisés pour gérer cela !
    Donc c'est -3 pour trois chiffre après la virgule pour rester cohérent avec RoundTo
    C'est un peu retord, d'où l'aide de RoundTo qui donne cette exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RoundTo(1234567, 3) = 1235000
    RoundTo(1.234, -2) = 1.23
    RoundTo(1.235, -2) = 1.24
    RoundTo(1.245, -2) = 1.25
    Et surtout, c'est IntPower qui gère parfaitement la puissance négative !
    Ce code n'est totalement pas de moi, si je me souvient bien, je me suis très fortement inspiré du Math.pas de C++Builder 6 (je ne l'ai plus installé, je ne peux pas confirmer)

    Si l'on prend comme dans ton code de test avec 4.25687 avec la version Trunc(/) * avec le même paramètre -3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TruncTo(4.25687, -3) = Trunc(4.25687 / 0.001) * 0.001 = 4256 * 0.001 = 4.256
    c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trunc(4.25687 * 1000) / 1000
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  18. #18
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Il faut inverse le signe du paramètre TRoundToRange, c'est négatif pour les nombres après la virgule
    Les opérateurs / et * sont organisés pour gérer cela !
    Donc c'est -3 pour trois chiffre après la virgule pour rester cohérent avec RoundTo
    C'est un peu retord, d'où l'aide de RoundTo qui donne cette exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RoundTo(1234567, 3) = 1235000
    RoundTo(1.234, -2) = 1.23
    RoundTo(1.235, -2) = 1.24
    RoundTo(1.245, -2) = 1.25
    Et surtout, c'est IntPower qui gère parfaitement la puissance négative !
    Ce code n'est totalement pas de moi, si je me souvient bien, je me suis très fortement inspiré du Math.pas de C++Builder 6 (je ne l'ai plus installé, je ne peux pas confirmer)

    Si l'on prend comme dans ton code de test avec 4.25687 avec la version Trunc(/) * avec le même paramètre -3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TruncTo(4.25687, -3) = Trunc(4.25687 / 0.001) * 0.001 = 4256 * 0.001 = 4.256
    c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trunc(4.25687 * 1000) / 1000
    Salut,
    Effectivement, je n'ai pas fait attention à la possibilité des valeurs négatives.
    Merci Shai
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

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

Discussions similaires

  1. [XE2] Comment avoir son programme toujours visible
    Par mario9 dans le forum Langage
    Réponses: 6
    Dernier message: 11/01/2015, 16h08
  2. Réponses: 1
    Dernier message: 16/09/2008, 14h35
  3. Réponses: 2
    Dernier message: 31/03/2008, 11h27
  4. Réponses: 7
    Dernier message: 24/10/2005, 23h10

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