我刚开始使用Objective-C,并且一般使用C语言,所以我认为这也是一个C问题。它更像是一个为什么的问题,而不是如何问题。
我注意到,在划分两个整数时,小数部分向下舍入到0
,即使结果是浮点数。我遵循的来源建议采用以下方法来解决这个问题:
float result = (float) numerator / denominator;
我现在想知道为什么这是有效的。特别是两件事。 1)如果你必须施放分子,你为什么不必投射分母呢? 2)为什么你不能把整个事情投入?我先尝试的是
float result = (float) (numerator / denominator);
但是这又将小数部分舍入为0
。是什么原因?
答案 0 :(得分:8)
通过促使分子浮动,你也需要提升分母。但是,当你将两个放在parens中时,那么你告诉编译器以整数然后强制转换为浮动来完成工作。
答案 1 :(得分:3)
因为在第一种情况下,在将分子转换为float
之后,分母将自动提升为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
答案 2 :(得分: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.0F
(类型float
)转换为7.0
(类型double
)。
...
答案 3 :(得分:2)
我相信你也可以投射分母,你会得到预期的结果。
float result = numerator / (float) denominator;
这可行,但不必要。
float result = (float) numerator / (float) denominator;
首先执行整数除法(因为操作数都是整数,它们用括号括起来),然后将结果转换为浮点数。
float result = (float) (numerator / denominator);
只要你将分子或分母投射到一个浮点数(或两者都是单独的),那么除法将使用浮点除法而不是整数除法来执行。