Condition sur un float ?

Résolu
Rodd -  
 Rodd -
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 15219 Date d'inscription   Statut Modérateur Dernière intervention   365
 
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
Rodd
 
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