Condition sur un float ?

Résolu/Fermé
Rodd - Modifié par Rodd le 27/09/2016 à 22:13
 Rodd - 27 sept. 2016 à 22:24
Bonjour,

Pour un TP d'informatique je dois faire plusieurs petits exercices.
Pour ne pas avoir a créer autant de .c que d'exercices, j'ai créé une sorte de menu dans le main qui exécute chaque exercice comme une fonction.

int main()
{
    float exo=0.0;
    printf("Choissez l'exercice (de 8 a 25)\n");
    scanf("%f", &exo);
    if(exo==8)          exo8();
    else if(exo==9)     exo9();
    [...]
    else if(exo==13.1)  exo13_1();
    else if(exo==13.2)  exo13_2();
    else if(exo==14)    exo14();


Certain exercice ont des variantes (ici le 13), j'ai donc créer des fonction
exo13_1()
et
exo13_2()
.

Le probleme est le suivant : quand j'entre au clavier 8, la fonction
exo8()
se lance, mais quand j'entre 13.1 (ou 13.2) la fonction exo13_1() n'est pas appelée par le main().
j'ai essayé d'écrire
13.1
,
13,1
.

Je ne vois pas du tout pourquoi cela ne fonctionne pas alors que la variable
exo 
est bel et et bien de type
float
.

Si quelqu'un a une explication, ou une solution a mon problème je lui en serais très reconnaissant.

Merci beaucoup.

2 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
Modifié par NHenry le 27/09/2016 à 22:16
Un float n'est pas un nombre aussi clair que 13.1, il peut valoir 13.10001 par exemple, ce qui n'est pas == à 13.1.

De base on évite les égalité stricte sur des flottants, par exemple :
(1/5)!=0.2 car 1/5 ne sera pas 0.2, mais 0.19999 par exemple.

2 solutions :
- Changer la méthode de saisie
- utiliser une comparaison plutôt :
if(exo>13.05 && exo <13.15)
par exemple.

J'interviens principalement en VB6 et VB.NET, avec un peu de C#, mais la modération m'amène souvent sur d'autre langages.
En VB.NET pensez à activer "Option Explicit" et "Option Strict"
0
Je pensais que 13.1 était égal a 13.1000000.... pour l'ordinateur, au temps pour moi.

Mais il n’empêche que votre solution fonctionne très bien, à l'avenir je ferait attention avec les floats.

Merci beaucoup !
0