Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de type de variable

Sujet résolu
    19 septembre 2011 à 15:44:35

    Bonjour, je commence à apprendre le java et j'ai un exercice où je dois faire un script pour rendre la monnaie.

    Mon algo a l'air d'être bon, mais eclipse m'indique une erreur pour des valeurs qui ne sont pas entière alors que j'ai bien déclaré les variables comme étant des doubles:

    import java.util.Scanner;
    
    public class monnaie {
    	
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		double pieces[] = {2.0, 1.0, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
    		int nbPieces[] = {0,0,0,0,0,0,0,0};
    		double nb1, nb2, diff;
    		int i = 0;
    		
    		
    		System.out.println("Entrez le prix a payer:");
    		nb1 = sc.nextDouble();
    		System.out.println("Entrez la somme payée:");
    		nb2 = sc.nextDouble();
    		
    		
    		diff=nb2-nb1;
    		
    		
    		if (diff==0) {
    			System.out.println("Le compte est bon");
    		} 
    		else if(diff<0){
    				System.out.println("La personne n'a pas donné assez d'argent");
    		}
    		else{
    			
    			i=0;	    
    		    while (diff>0)
    		    {
    		    	
    		    	
    		        while ((diff-pieces[i])>=0)
    		        {
    		               diff=diff-pieces[i];
    		               ++nbPieces[i];
    		        }
    		        ++i;
    		    }
    		    
    		    
    		    
    		    if(nbPieces[0]>0)
    		    	System.out.println(nbPieces[0]+" pieces de 2");
    		    
    		    if(nbPieces[1]>0)
    		    	System.out.println(nbPieces[1]+" pieces de 1");
    		    
    		    if(nbPieces[2]>0)
    		    	System.out.println(nbPieces[2]+" pieces de 0.5");
    		    
    		    if(nbPieces[3]>0)
    		    	System.out.println(nbPieces[3]+" pieces de 0.2");
    		    
    		    if(nbPieces[4]>0)
    		    	System.out.println(nbPieces[4]+" pieces de 0.1");
    		    
    		    if(nbPieces[5]>0)
    		    	System.out.println(nbPieces[5]+" pieces de 0.05");
    		    
    		    if(nbPieces[6]>0)
    		    	System.out.println(nbPieces[6]+" pieces de 0.02");
    		    
    		    if(nbPieces[7]>0)
    		    	System.out.println(nbPieces[7]+" pieces de 0.01");
    		}
    	}
    }
    


    Il me met une erreur à la ligne 14 (nb1 = sc.nextDouble();) , pourquoi ?
    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2011 à 16:33:10

      Salut.

      Quelle est ton erreur exactement ? Copie/colle ce s'affiche dans ta console. Peut-être que tu mets une virgule en entrant le prix, au lieu d'un point.
      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2011 à 19:25:44

        Quand je mets par exemple: 12.54, j'ai l'erreur suivante:



        Exception in thread "main" java.util.InputMismatchException
        at java.util.Scanner.throwFor(Unknown Source)
        at java.util.Scanner.next(Unknown Source)
        at java.util.Scanner.nextDouble(Unknown Source)
        at monnaie.main(monnaie.java:14)
        • Partager sur Facebook
        • Partager sur Twitter
          19 septembre 2011 à 20:47:32

          Essaye avec 12,84, et tu verra que la source de ton problème est là.
          Quoi que, ce n'est pas vraiment un problème, sauf si ta contrainte est de pouvoir rentrer 1.2 et non 1,2.
          • Partager sur Facebook
          • Partager sur Twitter
            20 septembre 2011 à 3:00:07

            Note : une boucle pour réaliser l'affichage finale de la suite de if, ça ferait quand même un poil plus propre. :/
            • Partager sur Facebook
            • Partager sur Twitter
              20 septembre 2011 à 14:03:27

              Oui tu as raison je vais plutôt mettre une boucle.

              Quand je mets 12,84 par exemple j'ai une erreur à une autre ligne:

              Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
              at monnaie.main(monnaie.java:35)

              Cela correspond à:
              while ((diff-pieces[i])>=0)

              Qu'est ce qui ne va pas là ?
              • Partager sur Facebook
              • Partager sur Twitter
                20 septembre 2011 à 14:45:07

                Ton erreur vient du fait que les doubles finissent par être imprécis à force de leur ajouter ou de leur soustraire de petites valeurs.

                Tu verras clairement de quoi je veux parler en affichant la valeur de ta variable diff à chaque fois que tu la modifie. Tu verras que même si elle valait 2 et que tu lui as enlevé 0.1, elle ne vaudra pas toujours 1.9 mais parfois 1.89999 ou 1.9999991 par exemple.

                Il faut tenir compte de ça et au lieu de faire des comparaisons avec 0, tolérer une certaine marge d'erreur.
                • Partager sur Facebook
                • Partager sur Twitter
                  20 septembre 2011 à 15:00:47

                  D'accord je comprends mieux, mais alors comment on peut faire pour permettre cette marge d'erreur ?

                  J'ai essayé en mettant: while ((diff-pieces[i])>=0.000001) mais ça ne change rien
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 septembre 2011 à 18:08:29

                    Déjà je pense que tu peux permettre une marge plus grande, par exemple 0.005 puisque les pièces le plus petites valent 0.01, mais bon dans l'absolu ça marchera avec ton seuil.

                    Ce n'est pas ici qu'il faut faire le test puisque tu cherche effectivement à rendre toute la monnaie nécessaire. Il faut le faire au while au dessus (celui avec diff>0, qui devient donc diff>0.005) car tu veux arrêter l'incrémentation de i au cas où il faudrait une pièce de moins de 1 centime, qui n'existe pas.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 septembre 2011 à 13:20:01

                      Même avec diff>0.005, ça ne marche pas
                      J'ai toujours la même erreur à la ligne 35 :/
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 septembre 2011 à 14:50:55


                        while (diff>0)
                        		    {
                        		    	
                        		    	
                        		        while ((diff-pieces[i])>=0)
                        		        {
                        		               diff=diff-pieces[i];
                        		               ++nbPieces[i];
                        		        }
                        		        ++i;
                        		    }
                        

                        ton soucis c'est que t'arrive à une diff entre 0 et 0.01 à cause des imprecision de calcule double
                        donc diff-piece[i] est tjs <=0 donc tu peux plus rendre de monnaie
                        et t'incremente toujours i parce que diff > 0, au bout d'un moment i depasse la taille de ton tableau ce qui provoque ton exception
                        donc soit tu remplaces while (diff>0) par while (diff>0.01) la valeur de ta piece minimal
                        soit tu remplaces par while (diff>0 && i<pieces.length)


                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 septembre 2011 à 15:24:29

                          Donne moi des valeurs pour lesquelles ça ne marche pas en faisant comme je t'ai dit parce que j'ai essayé plein de fois et ça a toujours marché...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 septembre 2011 à 18:49:49

                            J'ai mis 12,84 et 13, ça me donne encore la même erreur
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 septembre 2011 à 22:30:32

                              J'ai essayé 10 fois avec ces valeurs, aucun bug...

                              La partie de code qui pose problème chez toi et pas chez moi :
                              i=0;
                              while (diff>0.001) { 	
                              	while ((diff-pieces[i])>=0) {
                              		diff=diff-pieces[i];
                              		++nbPieces[i];
                              	}
                              	++i;
                              }
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 septembre 2011 à 23:09:47

                                J'ai copié collé ton code et ça marche, je comprends pas :lol:
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 septembre 2011 à 23:13:21

                                  Peut-être que ta marge d'erreur était trop basse.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Problème de type de variable

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown