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

Langage Java Discussion :

Comportement étrange de Math.round


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Comportement étrange de Math.round
    Bonjour,

    La fonction Math.round a un comportement etrange:
    Math.round(31 + 0.49f); renvoie 31
    Math.round(31 + 0.499999f);renvoie 31
    alor que :
    Math.round(32 + 0.49f); renvoie 32
    Math.round(32 + 0.499999f); renvoie 33

    Quelqu'un a-t-il une explication ?

    merci

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 815
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 815
    Points : 7 644
    Points
    7 644
    Par défaut
    Salut,

    Si tu fais les calculs, tu obtiens:

    Citation Envoyé par opasteur
    32 + 0.499999f = 32.5
    32 + 0.499999 = 32.499999
    32f + 0.499999f = 32.5
    32.0 + 0.499999f = 32.49999898672104
    32.0 + 0.499999 = 32.499999
    ça vient de la représentation binaire des valeurs décimales dans la mémoire de l'ordinateur, de la limitation du nombre de bits, des cast implicites, etc etc... (en prime, pour les valeurs que j'ai marquées, c'est des valeurs affichées avec un System.out, donc d'ici que la méthode toString() s'en mêle...)

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les nombres à virgules floattante ne sont pas toujours très précis ! Ainsi 32 + 0.499999f donne 32.5 ce qui fait que le round() est "correct"...

    Si tu veux avoir des calculs précis tu dois utiliser la classe BigDecimal en utilisant des String comme valeur et non pas des float ou des double...

    a++

  4. #4
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Avec les doubles aussi ça marche mieux

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thibaut
    Avec les doubles aussi ça marche mieux
    Pas forcément : dans ce cas précis peut-être mais on peut retrouver des problèmes similaires...

    a++

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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