2014-11-04 78 views
0

最近我在if語句中比較double時遇到了問題。我試圖用雙倍數來表示整數。作爲初學者,我不確定我的代碼出了什麼問題。比較double錯誤C++

這是我的代碼:

#include <iostream> 

using namespace std; 

int main(){ 
int x=0;//convert double to int 
long double Out;//Result 
long double In=10;//Input double 

//Loop Begin 
while(In>0){ 
x=In;//convert double to int 
Out= (x/In);//Out(test if whole number, will return 1) 

//test for 1 
//////////////// 
if(Out == 1){ 
    cout<<"[Whole Number] "; 
} 
//////////////// 
//test end 

cout<<"In :"<<In<<", "; 
cout<<"X :"<<x<<", "; 
cout<<"Out :"<<Out<<endl; 
In-=0.1;//decrease to finish loop (eventually) 
} 
//Loop End 

cin.get(); 
return 0; 
} 

這項計劃將測試和輸出的雙(中)整數。我意識到double的準確性影響了if語句,因此我無法得到「[Whole Number]」結果。雖然我發現如果我在「if(Out> = 0.9999)」中使用了(0.9999),那麼比較就會奏效。但我不確定解決方案,請幫忙!非常感激!

+1

可能重複的[我應該如何做浮點比較?](http://stackoverflow.com/questions/4915462/how-should-i-do-floatingpoint-comparison) – Slava 2014-11-04 18:49:45

回答

0

你的while循環永遠不會停止,它的無限循環。你在while循環中沒有做任何「In」值,因此它總是大於0,因此是無限循環。

0

你或許應該modf更直接地解決這個問題:

double int_part, frac_part; 

frac_part = std::modf(in, &int_part); 

if (frac_part == 0) { 
    // int_part contains integer value. 
} else { 
    // process the double non-integer floating point value. 
} 
0

您的代碼工作完全正常。如果你從10.0中減去0.1,那麼由於四捨五入錯誤,結果可能是而不是整數,並且你的代碼完全告訴你。代碼沒有錯,你的期望是錯誤的。

if (Out >= 0.9999) 

顯然不是一個解決方案,因爲如果In> = 10000.0,它將始終爲真。

0

做到浮點數被計算機轉換爲二進制表示的方式,它們本質上是不準確的,從而使邏輯比較有些具有挑戰性(http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)。在執行浮點數的這種比較時,通常會使用表示比較中可接受的最大誤差的ε常量(http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)進行比較。在你的情況下,你需要爲epsilon選擇一個合適的值(比如0.000001)。然後改變你的比較:

if(abs(out - 1) < epsilon){ //Take the difference between out and 1 
    cout<<"[Whole Number]"; //If it is "close enough" print to console 

}

我更多的Java的傢伙,但我相信你會需要的#include stdlib.h中利用了ABS()函數。

希望有幫助!