發生了一些非常奇怪的事情。objective-c除以總是返回0
float p1 = (6/100);
NSLog(@"p1 = %f", p1);
隨着代碼,我得到以下輸出這兩行:
P1 = 0.000000
爲什麼不工作與靜態數字的簡單devide!我有很多工作要做,以處理鴻溝不工作!他怎麼了,我瘋了嗎?
發生了一些非常奇怪的事情。objective-c除以總是返回0
float p1 = (6/100);
NSLog(@"p1 = %f", p1);
隨着代碼,我得到以下輸出這兩行:
P1 = 0.000000
爲什麼不工作與靜態數字的簡單devide!我有很多工作要做,以處理鴻溝不工作!他怎麼了,我瘋了嗎?
這些常量是整數,所以數學是用整數數學完成的。嘗試
float p1 = (6.0/100.0);
編輯 — @Stephen佳能明智地指出,由於「P1」是float
,我們沒有理由不這樣做的整個計算爲float
:
float p1 = (6.0f/100.0f);
現在,因爲這些事情都是常量,我想可能有一個很好的機會,無論如何編譯工作都會完成。同樣,由於在一些現代機器上(即Intel架構),浮點處理器指令集足夠怪異,看起來像是一個明顯的「優化」的東西可能會或可能不會這樣。最後我想可能是這樣的情況,即用float
常量進行操作可能會(在某些情況下)給出不同的結果,即使用double
值進行操作,然後將結果轉換爲float
,如果屬實,則該操作可能是決定一種方式或另一種方式。
您的分配包含整數除法,如果您除以的數字更大,則返回零。你大概的意思做:
float p1 = (6.0f/100.0f);
由於這兩個數字被認爲是由計算機整數,進行整數運算和整數沒有小數是0(0.06)返回,然後轉換爲浮動並存儲在變量p1中。
至少一個數字(或兩者)必須浮動才能進行浮點數學運算,當您將一個小數附加到數字上時,您會告訴計算機該常數是浮點數。
float p1 = (6.0/100);
或者你可以圍繞它強制轉換
float p1 = ((float)6/100);
一項工作分爲兩個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;
感謝,這是它。 – 2010-09-13 16:57:41
如果回答你的問題,你實際上應該接受答案。 – imaginaryboy 2010-09-13 18:17:08
但是使用單精度字面量來避免不必要的從double到single的轉換:'float p1 = 6.0f/100.0f' – 2010-09-13 19:41:53