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

API standards et tierces Java Discussion :

[DecimalFormat]longueur de partie décimale [FAQ]


Sujet :

API standards et tierces Java

  1. #1
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut [DecimalFormat]longueur de partie décimale
    Bonjour,

    j'ai un petit problème lorsque j'essaie d'appliquer un DecimalFormat au résultat d'une requête SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DecimalFormat df = new DecimalFormat("###,###,###.######");
    ...
    // récupération du resultset rs
    ...
    System.out.println(rs.getFloat("montant"));
    System.out.println(df.format(rs.getFloat("montant")));
    m'affiche

    Or dans la base de données, le montant est bien égal à 3189.08 (d'ailleurs c'est un champ de type number(15,2) ).
    Je ne comprends pas bien ce dysfonctionnement des dièses de fin qui me rajoutent des décimales sans raison.

    Si quelqu'un pouvait m'éclairer...
    Pensez au bouton

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    ton problème provient de la problématique de la gestion des réels (2 puissance -n) en Java (cette gestion est présente dans d'autres langages).

    La moindre opération (somme, soustraction, cast ...) sur des réels peut provoquer des erreurs d'arrondi.
    Cf. Exemple

    Or dans ton cas, la méthode format de la classe DecimalFormat prend un double en paramètre. Il n'y a pas de méthode pour un float. Ce qui implique qu'il fait un casting (un sur-casting plus exactement : float en double) implicite pour ta variable passée en paramètre.

    Or dans ton cas, le simple fait de caster ton float donne une valeur erronnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float rs =  3189.08f;
    double dbc = rs;  // Castage implicite 
                              // (équivalent à double dbc = ((double) rs);
    System.out.println(dbc);
    ---> Donne 3189.080078125

    C'est pourquoi tu obtiens ton erreur.

    Je vois 2 solutions,

    1. tu ne travailles qu'avec tes doubles car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double db = 3189.08;
    System.out.println(db);
    ---> Donne 3189.08

    Pas de conversion nécessaire

    2. Tu transforme en double avant le passage du paramètre en faisant un arrondi à n chiffres après la virgule

    Cordialement,

    Arnaud Coulon


    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    double d1 = 1000.0;
    double d2 = 1222.22;
    d1 = d1 + d2;
    System.out.println(d1);  ---> 2222.2200000000003 au lieu de 2222.22
     
    double d1 = 3.65;
    double d2 = 0.05;
    d1 = d1+d2;
    System.out.println(d1);	--> 3.6999999999999997 au lieu de 3.7
    [ Modéré par vedaer ]
    -> Ajout des balises code
    [ Merci de respecter les Règles du Forum ]

  3. #3
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    C'était donc ça

    Merci de ton aide, je n'aurais jamais trouvé la solution tout seul... Je pense que je vais travailler avec des doubles uniquement, ça sera plus propre.
    Pensez au bouton

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/05/2021, 15h33
  2. Extraire la partie décimale d'un nombre
    Par Kant2006 dans le forum C++
    Réponses: 19
    Dernier message: 16/06/2006, 20h05
  3. partie décimale / partie entière
    Par NoBru dans le forum Access
    Réponses: 3
    Dernier message: 21/10/2005, 12h00
  4. Partie Décimale d'une division
    Par zaoueche dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/08/2005, 17h19
  5. récupérer la partie décimale d’un champ
    Par maouazzani dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/04/2004, 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