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 :

pb avec la fonction trunc()


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut pb avec la fonction trunc()
    Bonjour,
    je travaille sur des conversions entier / heures:minutes et je rencontre un pb avec la fonction trunc.
    En faisant trunc(v*60) si v*60 vaut 840, le trunc me retourne 839 (ce qui fait que je perds une précision de 1 minute dans mon résultat final)
    comment faire pour contourner ce pb ? je ne peux pas utiliser round car si v*60 vaut 1261,5 round renvoie 1262 (or c'est vraiment la valeur 1261 que je veux récupérer...) sinon j'ai un résultat avec une minute de trop...
    c'est un vrai casse-tête...

    merci de votre aide

    Isa

  2. #2
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    bonjour,

    Le type de déclaration de tes variables est à l'origine de ce petit désagrément.
    si v n'a pas plus de 4 décimales alors délare le en currency et essaie à nouveau humain.

    a+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut
    je dois faire plus de tests pour confirmer mais apparemment si je fais
    trunc(v * 60.01) ça semble fonctionner.

    Isa

  4. #4
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Bonjour moi, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Var
      Ya : Real;
      NbrDigit : Integer;
    begin
      Ya := LogN(16, 57);
      NbrDigit := Round(Ya);
      if Ya < Trunc(Ya)+0.5 then NbrDigit := NbrDigit + 1 ;
    end;

  5. #5
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par defluc
    Bonjour moi, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Var
      Ya : Real;
      NbrDigit : Integer;
    begin
      Ya := LogN(16, 57);
      NbrDigit := Round(Ya);
      if Ya < Trunc(Ya)+0.5 then NbrDigit := NbrDigit + 1 ;
    end;
    Oui c'est comme cela que l'on contourne se problème ou en utilisant des bibliothèques mathématiques adaptées.
    Cependant insistons sur le pourquoi du comment ?

    Et au passage je pense que ton exemple de code est faux ou du moins incomplet car il ne gère pas les valeurs négatives.

    a+

  6. #6
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Certes,

    Real * Integer = Real
    Double * integr = Double

    etc....

    donc si tu multiplie deux valeurs le format du résultat est le plus grand de tes deux formats.
    Or depuis que l'informatique existe les grands formats (cetains type de données) sont sujets aux effets de bord.
    Donc
    840 de type integer = 840
    840 de type currency = 840.0000
    840 de type float = +/- 840.000000000000
    soit 840.00000000000000000000000000001
    ou 839.99999999999999999999999999999999
    (le signe = signifie ici "est stocké sous la forme")

    En conséquence de quoi le Trunc qui te renvoie la partie entière te renverra un résultat différent suivant la machine sur laquelle tu travailles.

    a+

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Par défaut
    Citation Envoyé par Yurck
    840 de type integer = 840
    840 de type currency = 840.0000
    840 de type float = +/- 840.000000000000
    soit 840.00000000000000000000000000001
    ou 839.99999999999999999999999999999999
    (le signe = signifie ici "est stocké sous la forme")
    Non, non, Il n'y a pas de problème d'arrondi pour les nombres entiers, mais seulement pour la plupart des nombres décimaux.

    Sinon pour répondre à la question initiale un Trunc(v * 60 + epsilon) ou epsilon est fonction du type de nombre flottant choisi (Single, Double ou Extended) devrait faire l'affaire.

  8. #8
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par sovitec
    Non, non, Il n'y a pas de problème d'arrondi pour les nombres entiers, mais seulement pour la plupart des nombres décimaux.

    Sinon pour répondre à la question initiale un Trunc(v * 60 + epsilon) ou epsilon est fonction du type de nombre flottant choisi (Single, Double ou Extended) devrait faire l'affaire.
    Je dirai même plus il n'y a pas de problème d'arrondi avec les nombres entiers,
    mais seulement pour la plupart des nombres décimaux.

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

Discussions similaires

  1. Problème avec la fonction Trunc
    Par yulken dans le forum Langage
    Réponses: 12
    Dernier message: 08/08/2006, 14h33
  2. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37
  3. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22

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