2010-09-13 46 views
18

發生了一些非常奇怪的事情。objective-c除以總是返回0

float p1 = (6/100); 
NSLog(@"p1 = %f", p1); 

隨着代碼,我得到以下輸出這兩行:

P1 = 0.000000

爲什麼不工作與靜態數字的簡單devide!我有很多工作要做,以處理鴻溝不工作!他怎麼了,我瘋了嗎?

回答

35

這些常量是整數,所以數學是用整數數學完成的。嘗試

float p1 = (6.0/100.0); 

編輯 — @Stephen佳能明智地指出,由於「P1」是float,我們沒有理由不這樣做的整個計算爲float

float p1 = (6.0f/100.0f); 

現在,因爲這些事情都是常量,我想可能有一個很好的機會,無論如何編譯工作都會完成。同樣,由於在一些現代機器上(即Intel架構),浮點處理器指令集足夠怪異,看起來像是一個明顯的「優化」的東西可能會或可能不會這樣。最後我想可能是這樣的情況,即用float常量進行操作可能會(在某些情況下)給出不同的結果,即使用double值進行操作,然後將結果轉換爲float,如果屬實,則該操作可能是決定一種方式或另一種方式。

+0

感謝,這是它。 – 2010-09-13 16:57:41

+4

如果回答你的問題,你實際上應該接受答案。 – imaginaryboy 2010-09-13 18:17:08

+1

但是使用單精度字面量來避免不必要的從double到single的轉換:'float p1 = 6.0f/100.0f' – 2010-09-13 19:41:53

9

您的分配包含整數除法,如果您除以的數字更大,則返回零。你大概的意思做:

float p1 = (6.0f/100.0f); 
12

由於這兩個數字被認爲是由計算機整數,進行整數運算和整數沒有小數是0(0.06)返回,然後轉換爲浮動並存儲在變量p1中。

至少一個數字(或兩者)必須浮動才能進行浮點數學運算,當您將一個小數附加到數字上時,您會告訴計算機該常數是浮點數。

float p1 = (6.0/100); 

或者你可以圍繞它強制轉換

float p1 = ((float)6/100); 
1

一項工作分爲兩個int變量,並得到float結果。

int x = 5; 
int y = 7; 

float z = x/y; // always 0 

的修復

float z = 1.0 * x/y; 

注:如果更改爲了這個解決方案將無法工作。

編輯: 根據這個答案previous answer您可以使用此

float z = (float) x/y;