2013-05-07 23 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(或个别地),则除法将使用浮点除法,而不是整数除法进行。

相关问题