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

Langage Delphi Discussion :

Problème avec Round()


Sujet :

Langage Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème avec Round()
    Bonjour,

    Voici une fonction que j'ai créer pour arrondir un nombre réel :

    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
    Function Arrondi(Chiffre : Real; Decimal : Byte) : Real;
    Var
     
        Entier,
        Fract : LongInt;
        Apres  : Real;
        Ct     : Byte;
        xResult : Real;
        Code   : LongInt;
     
    Begin
      Entier := Trunc(Chiffre);
      Apres  := Chiffre - Entier;
      Code := 1;
      For Ct := 1 to Decimal do Code := Code * 10;
      Apres := Apres * Code;
      Fract := Round(Apres);
      xResult := Entier + (Fract / Code);
      Arrondi := xResult;
    End;
    Si Chiffre = 24.715, "Apres" sera donc égal à 71.5 lorsque la fonctionne appelera Fract := Round(Apres);.

    Pourquoi, Round me retourne donc 71 ??

    J'ai essayer de facon independante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TEcranPrincipal.Button1Click(Sender: TObject);
     
    var
      Montant : Real;
      Resultat : LongInt;
     
    begin
     
      Montant := 71.5;
      Resultat := Round(Montant);
     
      ShowMessage(FloatToStr(Resultat));
     
    end;
    Round arrondi bien à 72

    Je comprend pas trop la... j'ai fait bien des tests et je trouve rien.

    Merci de votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    24.715 ne possède pas de représentation exacte en binaire. Il est probable qu'il soit en interne arrondi à 24.7149999...

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci !

    Je serais donc tombé sur un cas, je l'expère tres particulier.

    J'ai résolu mon problème temporairement en ajoutant 0.0001 à 24.715.

    Apres est donc égal à 71.51 lors de l'appel de Fract := Round(Apres);

    Je trouve ca très moche comme résolution de problème.

    Comment as-tu fais pour savoir que 24.715 n'a pas de correspondance exacte en binaire ? Peut-etre cela pourrais m'aider dans le futur.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par bonpat01 Voir le message
    Je serais donc tombé sur un cas, je l'expère tres particulier.

    Comment as-tu fais pour savoir que 24.715 n'a pas de correspondance exacte en binaire ? Peut-etre cela pourrais m'aider dans le futur.
    Malheureusement le cas particulier c'est lorsqu'un nombre décimal possède une représentation exacte en binaire (il y a une chance sur 5^n, où n est ne nombre de chiffre décimaux, que ce soit le cas). Par exemple pour les nombres avec 3 chiffres décimaux il n'y a que ceux se terminant par .125/.375/.625/.875 qui ont une représentation binaire exacte.

    Citation Envoyé par bonpat01 Voir le message
    J'ai résolu mon problème temporairement en ajoutant 0.0001 à 24.715.

    Apres est donc égal à 71.51 lors de l'appel de Fract := Round(Apres);

    Je trouve ca très moche comme résolution de problème.
    Je confirme que ce n'est pas beau. Si il n'y a jamais plus de 4 chiffres décimaux la solution est d'utiliser le type currency plutôt que Real.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    bonjour

    l'aide a dit:
    Description

    La fonction Round arrondit une valeur de type réel en valeur de type entier.

    X est une expression de type réel. Round renvoie une valeur Int64 qui correspond à la valeur de X arrondie au nombre entier le plus proche. Si X se trouve exactement à mi-chemin entre deux nombres entiers, le résultat est toujours le nombre pair. Cette méthode est souvent appelée "arrondi bancaire".
    à plus!

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    tu as aussi les fonctions Ceil, Floor, et RoundTo
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. problème de syntaxe avec ROUND
    Par seb.garcia dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 02/05/2011, 17h16
  2. problème avec round
    Par NELLLY dans le forum MATLAB
    Réponses: 7
    Dernier message: 24/04/2010, 17h49
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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