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

avec Java Discussion :

Arrondi en Java


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Novembre 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Novembre 2017
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Arrondi en Java
    Bonjour,
    j'ai besoin de votre aide.

    Je veux faire l'arrondi avec des conditions comme suit :

    Au gramme le plus proche sans décimale si ≥10 g
    Au décigramme le plus proche si < 10 g et > 0,5 g
    «*0 g*» ou «*< 0,5 g*» autorisé si ≤ 0,5 g

    Pour cela j'ai créé une méthode
    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
    private Double nearByValueEur (Double value, Double minValue){
    		Double res = 0.0;
    		if (value >=10){
    			res= (double) Math.round(value);
    		}
    		else if (value >minValue && value <10){
     
            	BigDecimal bd = new BigDecimal(value);
            	bd= bd.setScale(2, RoundingMode.UP);
            	value = bd.doubleValue();
    		}
    		else if (value == minValue){
     
    			res=minValue;
    		}
    		else{
    			String msg= "Moins de 0,5 g sont autorisés";
    			return res= Double.valueOf(msg);
    		}
    		return res;
    	}
    Quand je lance, le programme ne marche pas. J'ai des doutes par rapport à la boucle.
    Si quelqu'un peut me corriger ou m'expliquer la faute.
    Je vous en remercie par avance.

  2. #2
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Citation Envoyé par RimaG Voir le message
    le programme ne marche pas
    C'est à dire ?
    Le programme plante ? Tu as quel message d'erreur ? quelle ligne plante le programme ?
    Tu n'as pas le résulat attendu ? Dans quel cas ? Tu as essayé avec quelles entrées ? Tu obtients quelles sorties ? tu attendais quoi comme sortie ?

  3. #3
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 209
    Points
    209
    Par défaut
    Quelle boucle ?

    Le premier problème c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String msg= "Moins de 0,5 g sont autorisés";
    return res= Double.valueOf(msg);
    Parce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Double.valueOf("Moins de 0,5 g sont autorisés");
    ça va coincer.
    Mon avis perso ça serait d'afficher le message et renvoyer la valeur plancher, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.out.println("Les valeurs de moins de " +minValue+  " g ne sont pas autorisées");
    res= minValue;
    Deuxième problème, dans la partie moins de 10g :
    Tu n'affecte jamais ta valeur de retour res, mais une variable value non utilisée.

    Troisième problème, pour être au décigramme près, il faut plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bd= bd.setScale(2, RoundingMode.UP);
    ce qui donne au final :

    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
    private Double nearByValueEur (Double value, Double minValue){
    		Double res = 0.0;
    		if (value >=10){
    			res= (double) Math.round(value);
    		}
    		else if (value >minValue && value <10){
     
            	BigDecimal bd = new BigDecimal(value);
            	bd= bd.setScale(1, RoundingMode.UP);
            	res = bd.doubleValue();
    		}
    		else if (value == minValue){
     
    			res=minValue;
    		}
    		else{
    			System.out.println("Les valeurs de moins de " + minValue +  " g ne sont pas autorisées");
    			res= minValue;
    		}
    		return res;
    	}
    et :
    new dbl 12.49 =12.0
    new dbl 12.50 =13.0
    new dbl 2.45 =2.5
    Les valeurs de moins de 0.5 g ne sont pas autorisées
    new dbl 0.25 =0.5


    NB : plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bd= bd.setScale(1, RoundingMode.UP);
    , la méthode HALF_UP donne des résultats plus exacts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bd= bd.setScale(1, RoundingMode.HALF_UP);
    new dbl 2.45 =2.5
    new dbl 2.44 =2.4
    new dbl 2.50 =2.5
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    else if (value == minValue){
    	res=minValue;
    }
    serait avantageusement remplacé par un >= dans la condition d'avant.

    Enfin dans le même ordre d'idée, l'arrondi de 12.49 ou 12.15 en 12.0 n'est pas bon non plus, merci round...

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    J'ajouterai que c'est typiquement le genre de cas dans lequel le TDD permet d'avancer au fur et à mesure jusqu'à arriver au bon résultat.



    Crée une classe de test unitaire (ce qui va sous-entendre de rendre cette méthode publique, et donc potentiellement de la mettre dans une autre classe) et procède étape par étape

    Crée le test : je dois avoir un arrondi au gramme le plus proche sans décimale si c'est ≥10 g (donc tester pour la valeur 10g qui doit renvoyer 10, 12.55 qui doit renvoyer 13, et 13.2 qui doit renvoyer 13 aussi)
    Implémente jusqu'à ce que le test soit vert

    Passe au contrat suivant : Au décigramme le plus proche si < 10 g et > 0,5 g

    ETC...

    Tu verras que tu arriveras à trouver la solution par toi même au fur et à mesure en te concentrant sur une seule problématique à la fois, et avec l'assurance que ton code fonctionne ensuite !




    Sinon, comme tes types en entrée sont des "Double", donc des objets java et pas des types de base, tu ne peux pas les comparer en utilisant '==' : il faut comparer les valeurs qui sont contenues (et comme c'est du double, ça risque de renvoyer faux même si c'est vrai) : utilise donc Bigdecimal.compareTo pour ça

Discussions similaires

  1. Problème d'arrondi en Java
    Par junior222 dans le forum Général Java
    Réponses: 13
    Dernier message: 07/05/2015, 12h29
  2. Dessiner des coins arrondis en Java
    Par rwikus09 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 06/01/2011, 22h56
  3. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55
  4. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

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