2013-05-07 28 views
1

我剛剛開始使用Objective-C和C一般,所以我想這也是一個C的問題。它更多的是爲什麼問題而不是如何問題。爲什麼只有分子投射才能浮動以獲得浮動商,同時除以兩個整數?

我注意到,雖然劃分兩個整數,小數部分四捨五入到0即使結果是float.The來源我跟着建議以下方法來處理這個:

float result = (float) numerator/denominator; 

我想要知道現在爲什麼這個工程。特別是兩件事。 1)如果你不得不施放分子,你爲什麼不必分配分母? 2)爲什麼你不能把所有東西都施放?我第一次嘗試是

float result = (float) (numerator/denominator); 

但這再次四捨五入小數部分0。是什麼原因?

回答

8

通過將分子推廣爲浮點數,您還需要提升分母。然而,當你把這兩個放在parens中時,你告訴編譯器做整型然後強制浮動。

3

因爲在第一種情況下,在將分子投射到float後,分母將自動提升爲float進行除法操作。但在第二種情況下,除法結果預期爲整數,因爲分子分母都是整數。在第二種情況下,任何小數部分都會被截斷,並且在將結果轉換爲浮點數之前完成。因此,只有第一個小數部分會產生正確的結果,而第二部分會給出截斷的結果。

float sum=5/2; //sum will be 2.000000,not 2.500000 
    float sum=5.0/2; //sum will be 2.500000 
    float sum=5/2.0; //sum will be 2.500000 
    float sum=(float)5/2; //sum will be 2.500000 
    float sum=5/(float)2; //sum will be 2.500000 
    float sum=(float)(5/2); //sum'll be 2.000000 as cast is after integer division 
+0

當然,最後一行應該有'float sum =(float)(5/2);'。 – 2013-05-07 17:42:54

+0

@ user1508881感謝您指出錯字.Edited。 – 2013-05-07 17:44:40

3

查看C99標準中的"usual arithmetic conversions"

基本上它說操作數必須是相同的類型,如果它們不是,它們會自動轉換。

所以,在4 * 3.5;4(類型int)被自動地轉換爲4.0(類型double)。
(double)4/7;7被轉換爲7.0
4/(double)7;4被轉換爲4.0
(double)4/(float)7;7.0Ffloat型)被轉換爲7.0double型)。
...

+0

當我看到你的名字時,我忍不住想到LMG.LMG是世界上許多地方Bren機槍的俚語。Phat!Phat!Phat!Phat!作爲童子軍,每允許擠壓1秒鐘。 – 2013-05-07 17:49:11

2

我相信你也可以投下分母,而你會得到預期的結果。

float result = numerator/(float) denominator; 

這會工作,但沒有必要。

float result = (float) numerator/(float) denominator; 

這首先執行整數除法(因爲操作數均爲整數,它們被包裹在括號),則鑄結果作爲浮動。

float result = (float) (numerator/denominator); 

只要投要麼分子或分母爲float(或個別地),則除法將使用浮點除法,而不是整數除法進行。

相關問題