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

Java Discussion :

Arrondi à 2 chiffres après la virgule


Sujet :

Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut Arrondi à 2 chiffres après la virgule
    Bonjour à tous,
    Je rencontre un problème d'arrondi dans le résultat de mon calcul..
    J'ai beau avoir vu la FAQ à ce sujet, utilisé les instructions : rint, floor, et autre round...

    Voilà mon code, j'ai éliminé la partie déclaration des variables pour des questions de visibilités, mais elles sont en double :

    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
     do
     
          {
     
     
              R1 = (I*P/N)/ Math.pow(1-1/(I/N+1), (N*Y));
     
              double  p = Math.pow(10.0, 2);
     
              R1 = Math.floor(R1*P+0.5)/p;
     
              I3 = Math.abs(I-I2)/2;
              I2 = I;
     
            if ( R1 > R )      {
                I = I - I3;
     
            }
            else if (R1 < R) {
                I = I + I3;
               }
     
     
          } while ( R1!= R);
     
            if ( R1==R) {
     
                I=I*100;
     
            }

    Aux premières passes de la boucle, j'ai bien l'arrondi à 2 chiffres..
    Mais là où celà coince, c'est lorsque la valeur de I devient par exemple 0.25, R1 devient mathématiquement 13253.11784687E17...
    Effectivement I peut devenir par exemple 0.25754, mais malgré le fait de déclarer R1 en round, int ou autre, il ne me m'arrondi pas la valeur à 13253.11

    Comment procéder ou quelqu"un aurait une idée ?
    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Points : 1 269
    Points
    1 269
    Par défaut
    Peut-être es-tu victime du syndrome de la virgule flottante, qui peut donner des résultats très étranges.

    Si tu veux avoir de bon arrondis, il te faut travailler avec des BigDecimal, au détriment de la lisibilité de tes formules de calcul.

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Sympa comme lien

    c'est intéressant de mettre en évidence ce type de comportement. Les virgules flottantes sont une vraie plaie à gérer, maintenant il est facile de voir les effets dévastateurs après quelques traitements mal réfléchis.

    Le tout est de maintenir soit une partie entière très petite, soit une faible précision, en jouant avec des combinaisons de round/soustractions pour limiter les dégats.

    c'est un truc qu'on ne doit jamais oublier et qui est trop peu connu/pris au sérieux.


  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    La précision x chiffres après la virgule m'importe peu..
    En fait ce que j'ai besoin c'est qu'il me conserve juste 2 chiffres après la virgule.
    C'est à dire que lorsque j'ai mes ittérations j'ai des chiffres style 2.53 ou 4.98 qui ressortent et non 2.538666468787E02 ou 7.4268798979E.... ( ce sont des exemples de chiffres..)
    Ce qu'il ne fait pas malgré la présence
    de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     double  p = Math.pow(10.0, 2);
     
              R1 = Math.floor(R1*P+0.5)/p;
    ou autre rint, round, etc...
    Je comprend bien que dans mon calcul il y a utilisation de la puissance..et donc que la résultante de mon calcul va en exponentiel...mais bon je demande juste le calibrage à 2 chiffres après la virgule..

    En basic ça marche ou celà marcherais assez bien avec un Int..pourquoi pas là..?

    et là il ne s'agit pas d'un formattage de sortie texte style decimalformat...

    Sinon la seule solution que je verrais c'est à chaque fois de convertir la sortie "double" 2.53965464 en sortie " string " à l'aide decimalformat, puis de reconvertir le format string en double afin de pouvoir effectuer les calculs...mais celà me parait néanmoint un peu lourd...


    a+

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Les convertsions toString ne sont pas vraiment utiles.

    Avec "Math.round( numberToRound * 100. ) / 100." tu obtiens un arrondi à 2 chiffres, si tu les places aux bon endroits, tu devrais pouvoir éviter les pertes de précision


  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    J'ai beau mettre le round où je veuts.. au bout de 4-5 itérations de la boucle voir moins des fois...je perd l'arrondissement après la virgule.. Là j'en arrive à :
    29372058360695E13
    .....

    ?

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    oui, apparement ton nombre devient trop énorme pour pouvoir garder de la précision.

    C'est comme ça avec les double: soit tu as beaucoup de chiffres avant la virgule, soit tu as beaucoup de chiffres après la virgule, mais pas les deux

    BigDecimal est la seule solution vraiment précise (c'est toi qui choisis la précision)

    ça demande par contre beaucoup plus de temps de traitement, et ça réduit la lisibilité du code....

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Hum, j'ai modifié les doubles en float...mais au bout de quelques itérations dans la boucle, j'ai à nouveau le même problème..
    Je n'arrive pas à conserver 2 chiffres après la virgule... Bizarre....

  9. #9
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par Telemak Voir le message
    Hum, j'ai modifié les doubles en float...mais au bout de quelques itérations dans la boucle, j'ai à nouveau le même problème..
    float est bien moins précis que double, donc tu ne fais qu'empirer le problème.

    Tu ne peux rien résoudre en utilisant les types intrinseques de java.

    Il faut utiliser BigDecimal

  10. #10
    Membre éprouvé
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Points : 1 269
    Points
    1 269
    Par défaut
    Le problème n'est d'ailleurs pas du aux types Java, car en C on a les mêmes soucis.

Discussions similaires

  1. Arrondi au Nème chiffre après la virgule
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/06/2011, 16h56
  2. Float et affichage de 3 chiffres après la virgule sans arrondi
    Par Lolitaaa dans le forum Général Java
    Réponses: 3
    Dernier message: 20/05/2011, 10h59
  3. Réponses: 3
    Dernier message: 22/03/2011, 07h41
  4. problème d'arrondi à 2 chiffres après virgule
    Par nerick dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 17h26
  5. [langage] Arrondi 2 chiffre après la virgule
    Par pacificc dans le forum Langage
    Réponses: 4
    Dernier message: 19/05/2005, 23h44

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