2011-10-14 124 views
1

我有一個雙精度值1318611498349.3559,我想通過執行以下操作將它轉換爲long值,但我得到的值爲-4506682935000170496,這對我來說似乎是錯誤的。Objective C - 如何將雙精度轉換爲長精度

double dv = ...; 
long lv = (double)dv; 
... 

我在哪裏可以找到這方面的一些文件?

+0

請提供您更多的代碼,包括你是如何初始化並打印的值。另外,你正在建造什麼樣的建築? –

回答

2

這是錯誤的,因爲一個double表示8個字節,long表示4個字節,所以雙數太大。

0

LONG_MAX是0x7FFFFFFFL或2147483647

即:

2147483647 

是小於一大堆:

1318611498349.3559 

我很驚訝,編譯器沒有barfing了轉換某種錯誤/警告,因爲不管你做什麼,64磅的東西都不適合32磅的袋子。

0
double vIn = 0.0; 
long vOut = (long)vIn; 

應該是轉換的方式。

+0

這相當於OP的代碼(它不適用於示例輸入)。 –

0

double可以表示數量遠遠高於long的數量,因爲它由多個有效數字和一個指數來表示其大小。

結果是值的範圍遠遠大於long可以處理的範圍。

點擊此處瞭解詳情:

http://en.wikipedia.org/wiki/Floating_point

,如果你使用了浮點類型,具有相同的比特數爲一個整體型這不會有問題 - 這不是問題的真正原因 - 事實上浮點數的設計代表了更大的範圍。

例如,最大4字節的浮點數不能用8字節的整數類型表示。

5

其他答案是正確的,因爲double可以保存比任何整數類型都大得多的值,但是如果double值在範圍內,它將很好地轉換。

編譯器不會因爲試圖將double加入long而造成的影響,因爲你實際上可以這樣做。很顯然,計算機中的所有內容都以1和0的字符串形式存儲,基本上你的代碼所做的就是說把vIn解釋爲一個長整型值。將浮點值的位取出並將它們解釋爲整型是很有用的,並且值不是在double表示的地方。

我實際上是想做相反的事情。我需要將一個很長的(實際上很長的)轉換成一個double。然後它打我,讓NSNumber做轉換。用你想要的值創建一個臨時的NSNumber對象,然後使用該方法獲得你想要的值的類型。

double vIn = 123.4321; 
long vOut = [[NSNumber numberWithDouble:vIn] longValue]; 

沒有保證,這將做你想做的。我猜如果double值大於long可以存儲的值,它只會返回最大值。

0

我用這個來存儲時代以來的秒數。這需要轉換,因爲timeIntervalSince1970返回一個double。在我的情況下,溢出不可能發生的(至少在不久的將來),但您也可以添加超過LONG_MAX的考驗......

NSDate * now = [NSDate date] ; NSNumber * seconds_since_epoch = [[NSNumber numberWithDouble:[now timeIntervalSince1970]] longValue];