2011-11-27 9 views
5

पर सभी अंकों के बिना मैं 2 डबल की तुलना करना चाहता हूं लेकिन सभी अंकों के बिना। उदाहरण के लिए मेरे पास यह डबल 1.548799778 है और यह 1.5479 9 0 9 78 है और मैं प्रत्येक से 1.xx की तुलना करना चाहता हूं। मैं इस डबल को 1.xx "कैसे" गोल कर सकता हूं ?? धन्यवाद2 युगल की तुलना करें लेकिन सी

+0

आप किस तरह के राउंडिंग चाहते हैं? उदाहरण के लिए, राउंड-अप या राउंड-डाउन? –

+0

@AdrienPlisson: मैंने अपनी पोस्ट हटा दी है ... आपकी व्याख्याओं के लिए धन्यवाद – Zakaria

+0

क्या आप गोल करना चाहते हैं या आप trunc करना चाहते हैं? –

उत्तर

4

से ceil समारोह

(x==0.0 && y==0.0) || fabs(x-y)/max(fabs(x),fabs(y))<1e-6 

तरह तुलना करने के लिए है कि x और y काफी निकट हैं, कुछ x उपयोग floor(x) या ceil(x) दौर के रूप में जनवरी Vorcak ने सुझाव दिया

Addenda : मुझे यकीन है कि यह NaN के लिए काम करेंगे (विवरण के सिर में दर्द दे)

+3

"x == 0 && y == 0" के बजाय मैं बस "x == y" का उपयोग करता हूं, यदि दो संख्या बराबर होती है तो तेज़ होता है। –

5

एक तकनीक इस तरह trunc समारोह का उपयोग किया जाएगा नहीं कर रहा हूँ:

double d1, d2; 
d1 = 1.548799778; 
d2 = 1.547990978; 
if (trunc(d1*100) == trunc(d2*100)) { 
    // do your thing 
} 

100 का उपयोग करना है क्योंकि आप दो दशमलव स्थानों चाहते हैं। यदि आप अधिक या कम दशमलव स्थान चाहते हैं तो आप अन्य नंबरों का उपयोग कर सकते हैं।

+0

क्या मुझे इसके लिए कोई lib आयात करने की आवश्यकता है? इसका कारण है कि सीएन – BlackM

+0

में ट्रंक अमान्य है, मैंने इसे 1.00xxxxxxxxx प्राप्त करने के लिए 10000000000 के साथ कोशिश की लेकिन मुझे xxxxxxxxxx.xxxxxx – BlackM

2

एक और संभावना सहिष्णुता के साथ तुलना का उपयोग करना है।

if (fabs(a - b) <= tolerance) { .... } 

अपनी सहनशीलता को चुनें कि आप कितनी सटीकता चाहते हैं।

उदाहरण के लिए, आप पहले 2 अंकों के उपयोग के लिए 0.001 होने के लिए सहनशीलता चुन सकते हैं।

+0

मिल गया है, अगर बहुत कुछ काम नहीं कर सकता है, तो '''' और 'b' छोटी संख्याएं हैं, जैसे' 1e- सहिष्णुता के साथ '1e-5'' 6' और '2e-6'। एक बेहतर सुझाव के लिए मेरा जवाब देखें। –

+0

हां, यह पूर्ण सहिष्णुता का उपयोग करता है और आपकी विधि सापेक्ष सहिष्णुता का उपयोग करती है, लेकिन इस विधि का उपयोग करके सामने आने वाली समस्या मेरे लिए हल करने योग्य है, यह केवल कुछ छोटी संख्या चाहता है, ऐसा लगता है 2, इसलिए इस मामले में, यह विधि होनी चाहिए पर्याप्त। –

0

निम्नलिखित में सबसे तेज़ निष्पादन समय हो सकता है, और यह फ़्लोटिंग पॉइंट चर की सामान्य तुलना के रूप में उपयोगी है।

if ( x-y < 0.01 && x-y > -0.01) 
0

आप Math.h कार्यों

double check(double number) 
{ 
    if (modf(number, 0) >= .5) 
     return number >= 0 ? ceil(number) : floor(number); 
    else 
     return number < 0 ? ceil(number) : floor(number); 
} 

double round(double number, unsigned int places) 
{ 
    double off = pow(10, places); 
    return check(number * off)/off; 
} 

if(round(1.548799778, 2) == round(1.547990978, 2)) 
{ 
} 
0

इस का उपयोग अगर जरूरत काफी तेजी से और विन्यास होना चाहिए कर सकते हैं। कोई अतिरिक्त विरासत पेश नहीं की गई है

int compare(double a, double b) 
{ 
    static const double PRECISION = 0.0001; 
    if (a < b) 
     return b - a < PRECISION ? 0 : 1; 
    else 
     return a - b < PRECISION ? 0 : -1; 
}