2011-11-27 56 views
5

我想比較2雙但沒有所有的數字。 例如我有這個雙1.548799778和這個1.547990978,我想比較每個1.xx。我怎樣才能將這個雙「回合」爲1.xx? 感謝比較2雙,但沒有所有的數字C

+0

你想要什麼樣的四捨五入?例如,是圓形還是圓形? –

+0

@AdrienPlisson:我刪除了我的帖子......感謝您的解釋 – Zakaria

+0

你想輪迴還是想要trunc? –

回答

0

使用floor或文件math.h

4

ceil功能來比較xy足夠近,像

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

x使用floor(x)ceil(x)由Jan Vorcak的建議

補遺 :我不知道它會爲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

我需要導入任何庫嗎?因爲它的說trunc在C99 – BlackM

+0

無效我試圖用10000000000爲了得到1.xxxxxxxxxxx,但我得到xxxxxxxxxx.xxxxxx – BlackM

2

另一種可能性是隻使用與容差的比較。

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

選擇你想要的精確度。

例如,您可以選擇公差爲0.001來使用前兩位數字。

+0

可能不會工作得很好,如果'a'和'b'是微小的數字,像'1e- 6'和'2e-6',公差爲'1e-5'。查看我的回答以獲得更好的建議。 –

+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; 
}