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

Discussion :

arrondis faux avec QString::number

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut arrondis faux avec QString::number
    Bonjour à tous,

    Je suis sur un problème en ce moment que je n'arrive pas à identifier, je vous l'expose.

    Je cherche à faire des arrondis monétaires sur des QLineEdit.
    J'ai donc créé un slot qui arrondis les valeurs des que l'utilisateur les a entré.

    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
    28
    29
    30
    31
    32
    MaClass::MaClass()
    {
         this->resize(740, 560);
     
         initWidget();
         initWidgetArchive();
     
         connect(somme_1, SIGNAL(editingFinished()), this, SLOT(initValues()));
         connect(somme_2, SIGNAL(editingFinished()), this, SLOT(initValues()));
         connect(somme_3, SIGNAL(editingFinished()), this, SLOT(initValues()));
         connect(somme_4, SIGNAL(editingFinished()), this, SLOT(initValues()));
    }
     
    void MaClass::initValues()
    {
         QString s;
         totalMois_1->setText(s.setNum(somme_1->text().toDouble() 
                             + somme_2->text().toDouble() 
                             + somme_3->text().toDouble() 
                             + somme_4->text().toDouble()));
     
         arrondir();
    }
     
    void MaClass::arrondir() 
    {          
         somme_1->setText(QString::number(somme_1->text().toDouble(), 'f', 2));
         somme_2->setText(QString::number(somme_2->text().toDouble(), 'f', 2));
         somme_3->setText(QString::number(somme_3->text().toDouble(), 'f', 2));
         somme_4->setText(QString::number(somme_4->text().toDouble(), 'f', 2));
         totalMois_1->setText(QString::number(totalMois_1->text().toDouble(), 'f', 2));
    }
    Résultat, ça se passe plutôt bien lorsque totalMois_1 (qui affiche le résultat) ne dépasse pas les 9999,99 euros, sinon l'arrondis est faussé, au lieu d'arrondir à la deuxième décimale, il arrondit à la première.

    (par exemple, si somme_1 = 10000,07
    totalMois_1 prendra la valeur 10000,10.
    Et ce qui m'étonne c'est que somme_1 lui reste à sa valeur de 10000,07 alors qu'il subit le même arrondis que totalMois_1).

    Voila, il doit surement y avoir un truc tout bête derrière tout ça, mais je vois pas

    Merci d'avance pour votre aide.
    En espérant avoir fait une description claire.

  2. #2
    Membre très actif
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Par défaut
    Les arrondis, c'est toujours délicat. Je pense que le problème vient du fait que tu arrondies à tout va.

    Pour ton cas, je te conseille une solution toute simple.

    Tu utilises un QDoubleSpinBox avec un setDecimals(2) et setSuffix(tr(" €")). Tu en mets un pour chaque champs et ça marche à coup sûr.

    J'espère que ça pourra t'aider.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Merci pour ta réponse, je vais voir ce que ça donne tout ça.

    Mais j'envisage déjà un autre problème : lorsque je vais vouloir faire des arrondis de mes valeurs avant d'imprimer. Je suis dans une classe que j'ai fais hériter de QTextEdit, gérée avec des curseurs et tous autres classes servant dans les QTextDocument.

    Je vois mal comment gérer mes arrondis avec des QDoubleSpinBox dans ce cas précis. Une idée ?

    Merci d'avance.

  4. #4
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    salut, j'ai un peu du mal à comprendre ton problème :

    Je suis dans une classe que j'ai fais hériter de QTextEdit, gérée avec des curseurs et tous autres classes servant dans les QTextDocument.
    Tes méthodes me paraissent assez confuses et peu adaptées (mais bon, j'ai ptêtre mal compris ton problème).

    Comme le dit FloMo, si dans ton interface tu veux faire entrer des valeurs numériques à l'utilisateur, autant mettre des QDoubleSpinBox et leur ajouter un suffixe correspondant à la devise utilisée (tu peux même rajouter un préfixe !).
    Tu peux enlever les flèches si tu veux que ça ressemble absolument à un QLineEdit, elles possèdent une méthode text() si tu veux récupérer la valeur, elles sont bloquées pour ne pas pouvoir entrer autre chose que du texte, et enfin tu peux préciser le nombre de décimales.

    Le truc c'est que si tu sommes des arrondis sans arrêt, tu cumules des erreurs qui au final se retrouvent dans le résultat final.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Salut,

    Je me suis mal fais comprendre, je vais reprendre points par points.

    J'ai une interface pour l'utilisateur d'une part, où ce dernier peut modifier les valeurs avant de les enregistrer dans la base de données, etc.
    Bref, pour ça, pas de problème je regarde en ce moment même pour remplacer mes QLineEdit par des QDoubleSpinBox (sans les deux flèches comme tu le précises).

    Mais j'ai autre chose en parallèle, c'est une fonction pour imprimer, j'ai édité un QTextEdit donc, pour en faire une belle page imprimable comportant des QTextTable, QTextFrame, etc...
    L'utilisateur n'est pas obligé d'avoir ouvert l'interface comportant les spinBox pour pouvoir imprimer, il ne le fait que lorsqu'il y a une modification à y faire.

    Donc lors de l'impression on va aussi cherché les données dans la Database (même cas pour l'interface), données qui n'ont pas encore forcément été arrondis (ça dépent si l'utilisateur à ouvert son interface et enregistré les données, ou non).

    Donc il me faut une fonction pour arrondir des données sans QDoubleSpinBox aussi, uniquement .


    Le truc c'est que si tu sommes des arrondis sans arrêt, tu cumules des erreurs qui au final se retrouvent dans le résultat final.
    Dans mon code initial, j'obtiens quand même un résultat bizarre, c'est seulement lorsque mon total dépasse les 9999,99 que ça me fais des misère sur les arrondis, ça ressemble quand même à une broutille dans le code non ?

    Je me demande si c'est pas due à une limitation de mon QLineEdit via QDoubleValidator, je vais vérifier ça en parallèle.


    En espérant avoir été clair cette fois-ci, sinon n'hésitez pas à me le faire savoir.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Je pense avoir trouver où est le problème malgrés que je ne l'identifie toujours pas.

    J'ai completement supprimé ma fonction qui fait les arrondis, je me suis contenté de la fonction qui fait les sommes en y ajoutant des debug, je vous la reposte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void MaClass::initValues()
    {
         QString s;
         totalMois_1->setText(s.setNum(somme_1->text().toDouble() 
                             + somme_2->text().toDouble() 
                             + somme_3->text().toDouble() 
                             + somme_4->text().toDouble()));
     
                         qDebug()<< totalMois_1->text().toDouble() << " - " << totalMois_1->text();
                         qDebug()<< solde_1->text().toDouble() << " - " << solde_1->text();
     
         // arrondir();
    }

    Voici le résultat du debug (deux cas de figure différent):

    9999.99 - "9999.99"
    9999.99 - "9999.99"

    10000.99 - "10000.99"
    10001 - "10001"
    Je sais pas pourquoi, on dirait que l'arrondis ce fait de lui même, peut être est-ce du à setNum(), je vais voir la doc...

    EDIT : Y'a quand même une petite chose qui me gêne avec QDoubleSpinBox, c'est que l'utilisateur ne peut choisir entre le point ou la virgule pour la séparation des décimales, mais bon, c'est pas bien grave.

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

Discussions similaires

  1. Arrondis faux sur requêtes analyse croisée et création de table
    Par Banban52 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/07/2007, 10h07
  2. Requête Vrai-faux avec "ENTRE"
    Par mooh91 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/07/2007, 13h29
  3. div coin arrondi décomposer avec IE7 ?
    Par fiston dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 20/05/2007, 16h43
  4. cout avec QString
    Par matrox dans le forum SL & STL
    Réponses: 4
    Dernier message: 18/05/2006, 05h26
  5. Pb de jointure externe avec un number
    Par mch_27 dans le forum Oracle
    Réponses: 2
    Dernier message: 07/03/2006, 15h33

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