2017-10-07 12 views
-5

ont un problème:C++ (30 <= 30) ne fonctionne pas

string bmi(double w, double h) 
{ 
    string answer; 
    double bmi = w/(h*h); 
    cout << setprecision(9) << bmi << endl; 
    if (bmi <= 18.5) { 
     answer = "Underweight"; 
    } else if (bmi <= 25.0){ 
     answer = "Normal"; 
    } else if (bmi <= 30.0){ 
     answer = "Overweight"; 
    } else { 
     answer = "Obese"; 
    } 
    return answer; 
} 

int main() { 
    cout << bmi(81.585, 2.1) << endl; 
    cout << bmi(90.25, 1.9) << endl; 
    cout << bmi(86.7, 1.7) << endl; 
    cout << bmi(200, 1.6) << endl; 
    return 0; 
} 

3 appel doit donner une réponse "surpoids", mais plutôt jeter "Obese", ce que je fais mal?

+0

Collez votre code ici s'il vous plaît – frslm

+0

Pas de travail images = (] – Engylizium

+0

test contre '30.00001' au lieu de' 30.0'. – rustyx

Répondre

1

Ceci est juste la nature des représentations de précision finie. Je vais vous montrer un exemple en décimal:

Dites que vous représentez 1/3 comme "0.333333". Si vous calculez (1/3 + 1/3 + 1/3) vous obtiendrez "0.999999" au lieu de "1.0". Donc, si vous vérifiez si c'est supérieur ou égal à un, vous obtiendrez faux.

Tout comme 1/3 n'a pas de représentation décimale exacte, 1/10 n'a pas de représentation binaire exacte. N'utilisez donc pas de nombres à précision finie dans des applications où des réponses exactes sont requises.

+0

Oui, j'ai cela à l'esprit quand je pensais à un problème. Mais pourquoi le code précédent fonctionne et comment je peux l'écrire correctement? – Engylizium

+0

@Engylizium Je ne sais pas ce que vous entendez par "code précédent fonctionne". Peut-être par chance ou peut-être que ce n'est pas le cas. Quant à savoir comment l'écrire correctement, vous pourriez peut-être utiliser '<= 30.00001'. –

+1

Fondamentalement, vous devez décider ce que vous voulez faire quand la réponse est si proche de 30 qu'il n'y a aucun moyen fiable de dire avec certitude de quel côté de 30 il tombe. Sinon, utilisez des représentations exactes tout au long. –