Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de calcule de double ou float

mon programme ne veut pas calculer mes nombres décimaux

    18 janvier 2021 à 20:49:02

    Bonjour, pour m'exercer au condition et au boucle en c j'essaye de faire un petit exercice dans le quelle je dois rendre l'argent si le prix est plus petit mon programme fonctionne mais quand j'essais de le faire avec des décimaux pour les centimes la le programme tourne en s’arrêtant  a 1 et ma tour crache ses poumon je me dis que c'est pas normal pouvez vous m'aider a savoir ou j'ai fauter merci d'avance.

    #include <stdio.h>
    #include <stdlib.h>
    
    /*
    	EXERCICE 2 :
    	Écrire un programe de rendu de monnaie. En saisissant le montant total des achats puis la somme
    	donnée, indiquer la monnaie à rendre (en billet de 20, 10, 5 et pièces de 2 ou 1)
    
    	Indication : 
    		-S'assurer que la somme donnée est bien supérieur à la somme des achats
    		-Gérer le cas ou aurait payé un montant égale au achats
    		-Rendre le moins de billets/pièce possible
    		-L'opérateur % sera utile pour cette exercice
    */
    
    int main(void)
    {
    	//variables
    	double montantAchat = 100;
    	double payement = 0;
    	double reste = 0;
    
    	//Monaiefloat
    	int nbBilletsVin = 0;
    	int nbBilletsDix = 0;
    	int nbBilletsCinq = 0;
    	int nbPieceDeux = 0;
    	int nbPieceUn = 0;
    	int nbPieceCinquanteCentime = 0;
    	int nbPieceVingtCentime = 0;
    	int nbPieceDixCentime = 0;
    	int nbPieceCinqCentime = 0;
    
    
    	printf("Prix des course : %f\n", montantAchat);
    	printf("Regler : ");
    	scanf("%le", &payement);
    
    	//Vérification si le payement est dans les régles
    	if(payement < montantAchat)
    	{
    		printf("Tu n' a pas donnée assez d'argent !!!\n");
    		exit(0);
    	}
    
    	//Calcule du rendue
    	payement -= montantAchat;
    	reste = payement;
    
    
    	if(reste)
    	{
    		printf("Reste : %f\n", reste);
    
    
    		while(reste > 0)
    		{
    			//Pour 20 euros
    			if(reste - 20 >= 0)
    			{
    				reste -= 20;
    				nbBilletsVin ++;
    				printf("Billet de vingt : %d\n", nbBilletsVin);
    				printf("Reste : %f\n\n", reste);
    
    			}
    			//Pour 10 euros
    			else if(reste - 20 < 0 && reste - 10 >= 0)
    			{
    				reste -= 10;
    				nbBilletsDix ++;
    				printf("Billet de dix : %d\n", nbBilletsDix);
    				printf("Reste : %f\n\n", reste);
    			}
    			//Pour 5 euros
    			else if(reste - 10 < 0 && reste -5 >= 0)
    			{
    				reste -= 5;
    				nbBilletsCinq ++;
    				printf("Billet de cinque : %d\n", nbBilletsCinq);
    				printf("Reste : %f\n\n", reste);
    			}
    			//Pour 2 euros
    			else if(reste - 5 < 0 && reste -2 >= 0)
    			{
    				reste -= 2;
    				nbPieceDeux ++;
    				printf("Pièce de deux : %d\n", nbPieceDeux);
    				printf("Reste : %f\n\n", reste);
    			}
    			//Pour 1 euros
    			else if(reste - 2 < 0 && reste -1 >= 0)
    			{
    				reste -= 1;
    				nbPieceUn ++;
    				printf("Pièce de un : %d\n", nbPieceUn);
    				printf("Reste : %f\n\n", reste);
    			}
    			//Pour 0.50 euros
    			else if(reste - 1.0 < 0 && reste -0.50 >= 0)
    			{
    				reste -= 0.50;
    				nbPieceCinquanteCentime ++;
    				printf("Pièce de un : %d\n", nbPieceCinquanteCentime);
    				printf("Reste : %f\n\n", reste);
    			}
    			//Pour 0;20 euros
    			else if(reste - 0.50 < 0 && reste -0.20 >= 0)
    			{
    				reste -= 0.20;
    				nbPieceVingtCentime ++;
    				printf("Pièce de un : %d\n", nbPieceVingtCentime);
    				printf("Reste : %f\n\n", reste);
    			}
    			//Pour 0.10
    			else if(reste - 0.20 < 0 && reste -0.10 >= 0)
    			{
    				reste -= 0.10;
    				nbPieceDixCentime ++;
    				printf("Pièce de un : %d\n", nbPieceDixCentime);
    				printf("Reste : %f\n\n", reste);
    			}
    			//Pour 0.5
    			else if(reste - 0.10 < 0 && reste -0.05 >= 0)
    			{
    				reste -= 0.05;
    				nbPieceCinqCentime ++;
    				printf("Pièce de un : %d\n", nbPieceCinqCentime);
    				printf("Reste : %f\n\n", reste);
    			}
    
    		}
    
    	printf("Reste : %f\n", reste);
    
    	}
    	else
    	{
    		printf("Le payement est tout pile\n");
    	}
    
    
    
    
    	return 0;
    }


     

    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2021 à 21:00:21

      Salut,

      Pour ce genre de truc, il est plus simple de tout gérer avec des entiers en centimes, tu pourras faire du modulo et calculer ton rendu de monnaie en 2 lignes dans ta boucle. Les flottants ne servant plus qu'à la saisie et à l'affichage en multipliant ou divisant par 100.

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        18 janvier 2021 à 21:23:56

        Très biens je vais faire cela merci pour la réponse ;)
        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2021 à 0:35:02

          Anate_Far_Farenc a écrit:

          Bonjour, pour m'exercer au condition et au boucle en c j'essaye de faire un petit exercice dans le quelle je dois rendre l'argent si le prix est plus petit mon programme fonctionne mais quand j'essais de le faire avec des décimaux pour les centimes la le programme tourne en s’arrêtant  a 1 et ma tour crache ses poumon je me dis que c'est pas normal pouvez vous m'aider a savoir ou j'ai fauter merci d'avance.


          Tu es tombé sur un problème très difficile en informatique, les calculs avec des nombres flottants.

          En effet, la précision d'un nombre flottant est limitée (concrètement 64 bits pour un double).

          Et il n'est pas possible de représenter exactement un nombre comme 100.10 avec le type double. En base 10, nous avons ce problème pour représenter un tiers (1/3 = 0.333333333...). Dans l'ordinateur c'est la base 2, et 0.1 ne peut pas être représenté exactement.

          Voici un programme illustrant le problème en affichant d'abord 0.1 avec 6 décimales, puis 20, puis en hexidécimal:

          #include <stdio.h>
          
          int main(void)
          {
          	const double n = 0.1;
          	printf("%%f : %f\n", n);
          	printf("%%.20f : %.20f\n", n);
          	printf("%%a : %a\n", n);
          
          	return 0;
          }

          Ce programme affiche :

          %f : 0.100000
          %.20f : 0.10000000000000000555
          %a : 0x1.999999999999ap-4
          

          On voit bien le problème avec 20 décimales. L'hexadécimal permet de retrouver les bits exacts, mais il faut d'abord maîtriser le format de stockage des nombres flottants, c'est un peu compliqué.

          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2021 à 2:02:37

            Puisque tu parles de 1/3, on n'a pas besoin des ordi pour s'embêter.
            1/3 = 0.333...
            1/3 * 3 = 1
            0.333... * 3 = 0.999...
            Bien sûr, à la limite 0.999... = 1
            mais si on s'arrête à un nombre fini de décimales, ce n'est plus vrai.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

            Problème de calcule de double ou float

            × 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