2011-02-02 29 views
5

我有一個雙倍的時間間隔,以秒爲單位。有效值爲0.0,0.5,1.0,1.5等。如何安全地將這個double轉換爲int?

現在我需要將此值轉換爲int。但我不能這樣做:

int converted = (int)theDouble; 

因爲什麼可能發生的是,我的雙由於浮點錯誤是0.999999999,而不是1.000000000。它只會切斷尾部,我們最終會得到0而不是1.另外,當我的double是0.9時,我想要一個1的整數。當它是1.1時,我希望int爲1。它是1.8,我想INT是2.

有一個round()函數,但Xcode不顯示此文檔。標題只會告訴它返回一個double。所以不是我需要的。

什麼是最安全的方式來獲得該double的close int表示?雖然它是雙倍數,我永遠也不需要比0.5或者一個零碎的數字更高的精度(我不是數學天才,也不知道確切的科學術語)。在math.h

int converted = (int)(round(theDouble)); 

回答

2

正如其他人所建議的,你可以舍入theDouble,但請記住,你不應該依賴浮點變量來獲得精確的精度。不要試圖與平等的整數比較theDouble,你應該做這樣的事情:

if (abs(theDouble - theInteger) <= 0.000001) 
    doSomething(); 

記住,theInteger會比較之前要轉換爲雙,所以它可能不準確或者。

最後一兩件事,稱:

int converted = (int) round(theDouble) 

稍微危險的,因爲,如你所說,浮點錯誤可能帶來的價值下降。如果你知道你的價值只會是0,0.5,1.0,1.5,...爲什麼不做這樣的事情?:

int converted = (int) (round(theDouble) + 0.1) 
4

執行此操作。它會返回一個double,但在你的情況下,你可以把它轉換爲int。或者使用lround(同樣在math.h),它需要一個double並返回一個long int。

5
int converted = (int)round(theDouble); 
7

您可能正在尋找lround(雙重功能)。 簽名看起來像這樣。

long int lround(double)。

其他選項是

  • 長整型lrint(雙)
  • 長的長整型llrint(雙)
  • 長的長整型llround(雙)