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 :

Précision sur les float


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut Précision sur les float
    Bonjour à tous,

    J'étais en train de développer une application tranquillement en Java (et oui on a réussit à me persuader que Java c'est bien), quand j'ai remarqué que Java me faisait des arrondis bizarre...

    Je m'explique, voici ce que faisais mon programme :

    - Je rentrais un nombre dans un String
    - Je le convertissais en float
    - Je multipliais le résultat par cent
    - Je récupérais la partie entière du résultat

    Par exemple : 1204.2141 -> 120421

    Vous allez me dire où est le problème :

    Est bien voila, j'avais remarqué que dans certains cas, mon programme se trompait d'un centième. Je me suis dit au début que je devais me tromper et pas faire attention... Mais en fait non il y a effectivement un bug ou une erreur tout dépend de comment on prend le problème le tout est d'être au courant ^^

    Voici un exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package test;
     
    public class test {
    	public static void main(String[] args) {
    		float temp = 154.18f;
    		System.out.println(temp);
    		temp = temp*100;
    		System.out.println(temp);
    	}
    }
    Le résultat est :

    Non ce n'est pas une blague... Tous les chiffres compris entre 127 et 164 se ayant 18 comme chiffre après la virgule ont sette propriété

    Je sais qu'il peut y avoir des erreurs d'arrondis sur le codage des chiffres, mais c'est tout de même gros la non :

    D'ailleurs, on peut voir tout de suite que le problème vient de cette erreur car le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    package test;
     
    public class test {
    	public static void main(String[] args) {
    		double temp = 154.18f;
    		System.out.println(temp);
    	}
    }
    Renvoie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    154.17999267578125
    Propagation d'erreur trop important pour le float ...:

    Désolé d'avoir été si long et désolé si je me suis trompé de rubrique ^^

  2. #2
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    très interessant comme problème

    Faut il en venir a la conclusion qu'il vaut mieu travailler avec des doubles (avec lesquels on a pas ce probème si on garde le meme exemple) ?
    En tout cas c'est un peu dommage d'utiliser des double la ou l'on sais que des float suffirai...
    De plus, il ne serait pas étonnant qu'avec des doubles on arrive au meme problème sur d'autres exemples.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut
    Non je ne pense pas... Travailler avec des doubles c'est une bonne solution quand on ne recherche pas la performance ou que le code est petit

    Il faut juste être au courant du problème. Je n'ai pas trouvé d'articles traitant du sujet sur internet, c'est pour cela que j'ai posté ici ^^

    M'enfin, je trouve ca gros quand même

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Par défaut
    si je me souviens bien de mes (vieux) cours.

    les float ( et double ) sont représentés en binaire (base 2) par un triplet ( signe , exposant , mantisse ) et une des limites de cette représentation est que certains rationnels n'ont pas de représentation EXACTE et par conséquent sont arrondis d'ou ton problème avec les float mais tu auras le meme problème avec des doubles (mais sur d'autres valeurs)

    solution : utiliser Math.BigDecimal qui utilise une représentation en base 10 qui supprime ce problème.

    j'espère que ça t'aidera

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

Discussions similaires

  1. Précisions sur les listes
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 07/02/2006, 21h20
  2. operation sur les float
    Par grand's dans le forum C++
    Réponses: 14
    Dernier message: 26/10/2005, 10h43
  3. [Math]probleme de precision de calcul sur les float
    Par calvin dans le forum Langage
    Réponses: 6
    Dernier message: 26/05/2005, 07h53
  4. Précisions sur les recordset DAO
    Par Igricheff dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2005, 17h16
  5. Précision sur les sauvegarde à chaud
    Par alxkid dans le forum Administration
    Réponses: 2
    Dernier message: 09/08/2004, 18h55

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