2014-03-02 72 views
0

今天早些時候我剛剛問了一半數字,並從@alk得到了很大幫助。在這個職位,我的想法是圍捕4.5〜5,但一輪下來4.4〜4。而且由@alk給出的解決方案是:舍入一個非零十進制數字的浮點數(C)

int round_number(float x) 
{ 
return x + 0.5; 
} 

和它的作品非常優雅!

在這篇文章中,我想討論如何實現小區()函數C. 在同一直線上,通過@alk最後給出的解決方案,我想出了以下內容:

int round_up(float y) 
{ 
    return y + 0.99999999; 
} 

這適用於所有情況,除非浮點數y有.00000001。我想知道是否有更好的方法來做與C中的ceil()相同的事情。謝謝!

+0

您提出的問題是如何** **然後在您說** ceil()**函數的內容中。這完全不同。你應該編輯它 –

+0

我不認爲有一種方法可以可靠地做到這一點,而不會陷入浮動格式。 –

回答

2

除非你知道可靠浮動的ε(我不知道C標準規定),我想你堅持return (y < 0 || y == (int)y) ? y : y + 1;

+0

對於許多負數(例如-1.1),此操作失敗。 – chux

+0

好的;我稍微修改以處理負值。 –

1

這種失敗對於負數。

int round_up(float y) { 
return y + 0.99999999; 
} 

但是,讓我們使用這個優勢。 floatint轉換是向0.0截斷。因此負數正在做一個「四捨五入」或「上限」功能。當我們有一個積極的float,轉換爲int注意到這是一個「地板」功能。當y不是整數時調整。

(假設內INT_MIN ... INT_MAXy。)

int ceil(float y) { 
    if (y < 0) { 
    return y; // this does a ceiling function as y < 0. 
    } 
    int i = y; // this does a floor function as y >= 0. 
    if (i != y) i++; 
    return i; 
} 

void ceil_test(float y) { 
    printf("%f %d\n", y, ceil(y)); 
} 
+0

它適用於不具有太長小數部分的數字。例如,如果y = -2.5,則返回int(-1.50000001)= -1,這是正確的 –

+0

@LưuVĩnhPhúc-2.5的上限是-2,而不是-1。 – chux

0

第一代碼段不正確地工作爲負數。 -3.5將來-3,-4不

int round_number(float x) 
{ 
    if (x >= 0) 
     return x + 0.5; 
    else 
     return x - 0.5 
} 

對於天花板,加入1是足夠

int ceiling(float x) 
{ 
    if (x < 0 || (int)x == x) 
     return x; 
    else 
     return x + 1.0; 
} 

當x = 3.0ø(R -3.0),則返回3(-3) 。對於x = 3.1它返回4,對於x = -3.1它返回-3

+0

@chux ahhh我錯誤地計算了數字軸 –