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

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    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 expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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
    Points : 1 511
    Points
    1 511
    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 régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    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 averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    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 régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    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 régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    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.

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Bon voila, c'était bien le setNum() du coup, doublé d'une erreur de compilation qui n'apparaissait pas, mais un make distclean en est venu à bout (j'ai repris la fonction number à la place du coup).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    totalMois_1->setText(QString::number(somme_1->text().toDouble() 
                             + somme_2->text().toDouble() 
                             + somme_3->text().toDouble() 
                             + somme_4->text().toDouble(), 'f', 2));

    Du coup j'hésite entre les QDoubleSpinBox et les QLineEdit que j'avais initialement, l'avantage de la QLineEdit étant la possibilité de pouvoir mettre un point ou une virgule lors de la saisie de nos décimales (lorsqu'on couple avec QDoubleValidator).

    Vous en pensez quoi ?

    Merci d'avance
    EDIT : désolé pour le triple post qui fait un peu tache

  8. #8
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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
    Points : 1 511
    Points
    1 511
    Par défaut
    Je pense qu'après c'est à toi de mesurer ce qui t'importe le plus :
    - la facilité du spinbox,
    - la souplesse du lineedit.

    Tout dépend de ton application, des utilisateurs que tu as en face, du temps de maintenance que tu es prêt à consacrer...

    Pense à mettre le tag [Résolu], ce qui n'empêche pas de continuer la discussion.

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Je vais choisir la souplesse de la QLineEdit, j'ai des utilisateurs très lambda en face de mon application normalement.

    Par contre, j'espère que cette solution ne sera pas source de bugs.

    Le bon coté du QDoubleSpinBox était aussi sa fonction setSuffix, dont j'étais un peu "tombé amoureux"

    Merci beaucoup à vous deux en tout cas !

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    Petite remarque
    En principe ce n'est pas à l'ihm de résoudre ce problème d'arrondi.

    L'ihm ne devrais être qu'une vue et ne devrais pas faire de traitement (du moins le minimum possible interdire de rentré un nombre de plus de deux chiffre après la virgule fait partie de sont boulot). Tu devrais avoir un code interne qui reçois les valeurs et donne les valeurs calculé. Et c'est lui qui devrais résoudre ton problème.

    cherche MVC (model view controler) sur google

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Ok, merci pour l'info

    Pour moi, le traitement de l'arrondis fait parti de l'affichage des valeurs à l'utilisateur (je me moque de savoir que la valeur est arrondis quand elle est stockée ou non).

    Mais si tu me dis que c'est pas la bonne méthode, je vais regardé ça de plus prêt alors.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Somato Voir le message
    Pour moi, le traitement de l'arrondis fait parti de l'affichage des valeurs à l'utilisateur (je me moque de savoir que la valeur est arrondis quand elle est stockée ou non).
    Si en interne tu veut utiliser des grandeurs plus précise, oui c'est l'ihm qui arrondi l'affichage.
    Après c'est la théorie en pratique.... surtout pour un tout petit projet.

    Sur de plus gros projet, si tu mélange ton traitement à l'ihm tu va droit dans le mur (tu peut le rater bien sure, mais c'est rare )

    En gros l'ihm c'est un cout/cin mais graphique. De plus en ayant fait ton code ainsi tu peut changer,remodeler linterface très facilement.
    Qt n'étant pas que de l'ihm, tu peut bien sure faire le cœur de ton appli avec Qt

+ 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