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 :

pb - résultat de type double/float arrondi


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Ayana
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 901
    Par défaut pb - résultat de type double/float arrondi
    Bonjour à tous,

    J'ai un petit soucis concernant un type de données.

    Je fais un petit calcul tout bête, à savoir (2+3)*3. Le résultat attendu est 1.66666....
    Or, le résultat que j'ai est 1.0

    J'ai beau avoir lu la FAQ et certains topics, les problèmes rencontrés sont plutôt inverses au mien, c'est-à-dire que les développeurs cherchent à restreindre le nombre de chiffres après la virgule.
    Moi j'aimerais en avoir 2 après la virgule, mais je n'arrive même pas à en avoir un, il arrondit systématiquement à l'inférieur !!

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static double calcul(int nb1, int nb2){
      	  	return (nb1+nb2)/nb2;
      	}
    Que je mette en double ou en float, j'ai exactement le même résultat.

    Je suis sur Eclipse 3.0.1.

    Faut-il changer un paramètre sur Eclipse ou y-a-t-il une fonction pour résoudre se problème, autre que BigDecimal ???

    Merci d'avance pour votre aide .

  2. #2
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    déclare tes nombres nb1 et nb2 comme des float et ton résultat est également un float :

    j'ai exécuté ca rapidement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    package testsestsest;
    public class Testest {
        public static void main(String[] args) {
            float nb3, nb1=2, nb2=3;
            nb3= (nb1+nb2)/nb2;
            System.out.println(+nb3);
        }
    }
    et ca me donne 1.6666666 en sortie

  3. #3
    Membre émérite
    Avatar de Ayana
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 901
    Par défaut
    Oui, ça me donne les chiffres après la virgule, merci .
    Et si je mets en double, j'ai 1.6666666666666667

    Mais si je ne veux que 2 chiffres après la virgule ?

    Edit : J'ai fait ça, d'après la FAQ, mais il n'y a pas d'autres solutions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public static float calcul(float nb1, float nb2){
      	  	logger.info("Calcul lancé ...");
      	  	float nb3=(nb1+nb2)/nb2;
      	  	nb3*=100;
      	  	nb3 = (int)(nb3+.5);
      	  	nb3/=100;
      	  	return nb3;
      	}

  4. #4
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    Citation Envoyé par Ayana Voir le message

    J'ai beau avoir lu la FAQ et certains topics, les problèmes rencontrés sont plutôt inverses au mien, c'est-à-dire que les développeurs cherchent à restreindre le nombre de chiffres après la virgule.
    je ne fais que te citer ca veut dire que tu as déja trouvé la solution...
    plus sérieusement j'ai déja vu la solution dans un topic mais je sais plus comment faire

    edit: si il y a d'autre solutions attend je cherche...

  5. #5
    Membre émérite
    Avatar de Ayana
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 901
    Par défaut
    Merci à toi en tout cas, je n'avais pas penser à déclarer les paramètres du même type que la sortie.

    Par contre dans mon main() j'ai gardé mes déclarations en int, ça me permet de faire mon traitement d'exception, vu que je ne veux que des entiers en entrée .

  6. #6
    Membre émérite
    Avatar de Ayana
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 901
    Par défaut
    J'avais mis le "résolu" mais je l'ai enlevé une fois que j'ai fini les tests .

    La partie qui a été vue ci-dessus fonctionne, mais dans l'ensemble de mon programme, ça me pose un GROS problème pour lever une exception.

    Voici mon piti programme :

    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
    33
    34
    35
    public class Test_log4j {
     
      	private static final Logger logger = Logger.getLogger(Test_log4j.class);
      	// équivalent --> static Category cat = Category.getInstance(Test_log4j.class.getName());
      	// on le met en statique afin d'économiser de la mémoire
     
      	// choix de la langue --> Locale.getDefault() <=> Locale.FRANCE
      	Locale locale = Locale.getDefault();
     
      	public static void main(String[] args) {
     
      	  	// on configure via le fichier "log4j.properties" placé avec le fichier ".classpath"
      	  	PropertyConfigurator.configure("log4j.properties");
     
      	  	int n1=2;
      	  	int n2=0;
     
      	  	try{
       	  	   logger.info("Résultat de (" + n1 + "+" + n2 + ")/" + n2 + " : " + calcul(n1,n2));
      	  	}catch (ArithmeticException e){
      	  	   // traitement des erreurs mathématiques (division par 0 ...)
      	  	   logger.fatal("Erreur fatale !!");
      	  	}
      	}
     
      	public static float calcul(float nb1, float nb2){
      	  	logger.info("Calcul lancé ...");
      	  	float nb3=(nb1+nb2)/nb2;
      	  	// méthode pour arrondir à 2 chiffres après la virgule
      	  	nb3*=100;
      	  	nb3 = (int)(nb3+.5);
      	  	nb3/=100;
      	  	return nb3;
      	}
    }
    Avant de modifier ma méthode calcul, je pouvais lever une exception pour les divisions par 0.
    Maintenant que j'ai mis en float, ça n'est plus le cas .
    En gros, 0 en float n'est pas un bô 0 comme je les aime ...
    Et en résultat il me met : 2.1474836E7
    Si j'enlève la partie qui me permet d'arrondir, le résultat est éloquent : Infinity

    Que faire ??

  7. #7
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    question pourquoi tu fais ca :
    sinon pour ta division par 0 tu n'a qu'a faire un test sur nb2 tu n'a pas besoin de lever une exception...

  8. #8
    Membre émérite
    Avatar de Ayana
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 901
    Par défaut
    Heu, je fais bêtement ce qu'il y a dans la FAQ



    si je fais (2+3)*3, ça me donne n3=1.66666666666....7
    n4=n3*100=166.66666...7
    n5=entier(n4+0.5)=entier(167.16666)=167
    resultat=n5/100=1.67

    Et j'ai mon résultat arrondi, bizarrement mais ça marche

  9. #9
    Membre émérite
    Avatar de Ayana
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 901
    Par défaut
    Citation Envoyé par nayah Voir le message
    question pourquoi tu fais ca :
    sinon pour ta division par 0 tu n'a qu'a faire un test sur nb2 tu n'a pas besoin de lever une exception...
    C'était juste pour tester ma journalisation (qui marche d'ailleurs ) couplée à une exception.
    Mais j'aurais bien aimé trouver une "bonne" solution à mon piti problème de format quand même .

  10. #10
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    ok je cherche pour etre franc j'essai de trouver comment lui faire comprendre que 0.0 =0 lol

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

Discussions similaires

  1. Pb d'arrondie de type double
    Par la debutante dans le forum C#
    Réponses: 10
    Dernier message: 19/09/2007, 16h47
  2. float, double et arrondi
    Par simla dans le forum Langage
    Réponses: 2
    Dernier message: 25/08/2007, 15h22
  3. [C] Récupérer un résultat de fonction de type double
    Par EnigmuS dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 23/04/2007, 10h17
  4. arrondi avec type double
    Par la drogue c'est mal dans le forum MFC
    Réponses: 6
    Dernier message: 08/04/2005, 17h51

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