2017-10-07 101 views
-5

有一個問題:C++(30 <= 30)無法正常工作

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調用必須給予 「增持」 的答案,而是拋出 「肥胖」,是我做錯了嗎?

+0

請將您的代碼粘貼到這裏,請 – frslm

+0

不工作圖片=(] – Engylizium

+0

對'30.00001'而不是'30.0'進行測試 – rustyx

回答

1

這只是有限精度表示的本質。我給你舉一個十進制的例子:

假設你表示1/3爲「0.333333」。如果你計算(1/3 + 1/3 + 1/3),你會得到「0.999999」而不是「1.0」。所以如果你檢查它是否大於或等於1,你會得到錯誤的。

就像1/3沒有精確的十進制表示,1/10沒有確切的二進制表示。所以不要在需要精確答案的應用中使用有限精度數字。

+0

是的,當考慮到問題時,我有這樣的想法。但爲什麼以前的代碼工作,我怎麼寫它的權利? – Engylizium

+0

@Engylizium我不知道你以前的代碼作品是什麼意思。也許是運氣好,或者只是碰巧不會觸發這個問題。至於如何寫正確,也許你可以使用'<= 30.00001'。 –

+1

基本上,當答案如此接近30以致沒有可靠的方法來確定它落在哪一邊時,你必須決定你想要做什麼。否則,請一直使用準確的表示。 –