C++(30<30)不工作

C++(30<30)不工作,c++,if-statement,double,C++,If Statement,Double,有问题: 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){ answe

有问题:

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呼叫必须给出超重的答案,但我错在哪里?

这正是有限精度表示的本质。我将向您展示一个十进制的示例:

假设您将1/3表示为0.333。如果你计算1/3+1/3+1/3,你会得到0.999999而不是1.0。所以如果你检查它是否大于或等于1,你会得到false


正如1/3没有精确的十进制表示法,1/10也没有精确的二进制表示法。因此,在需要精确答案的应用程序中,不要使用有限精度数字。

请将代码粘贴在此处不要使用工作图像=]测试30.00001而不是30.0。您已经成为会员将近一年了。这是足够的时间来阅读,特别是命名和。也请和。最后,请学习如何创建。还要注意,30是int类型的整数值,但您使用的是double类型,它在使用通用格式的二进制平台上存在舍入问题。请花点时间阅读是的,当我想到这个问题时,我就想到了这一点。但是为什么以前的代码有效?我如何才能把它写对?@Engylizium我不知道你所说的以前的代码有效是什么意思。也许是运气好,也许只是碰巧没有引发这个问题。至于如何写出正确的答案,也许你可以从根本上说,当答案接近30时,你必须决定你想做什么,因为没有可靠的方法确定答案落在30的哪一边。否则,请始终使用精确的表示法。我的意思是,在25.0和18.5版本下,它可以工作。谢谢,我会记住的。我只是C++中的新手。在与迅捷公司合作之前。有时它会碰巧给出你想要的答案,有时它会碰巧给出你不想要的答案。这就是使用不可靠方法的本质。如果您检查1/3+1/3+1/3是否小于或等于1,您将得到正确的答案。