为什么只有分子转换才能在分割两个整数时获得浮点商?

时间:2013-05-07 17:30:57

标签: objective-c c clang

我刚开始使用Objective-C,并且一般使用C语言,所以我认为这也是一个C问题。它更像是一个为什么的问题,而不是如何问题。

我注意到,在划分两个整数时,小数部分向下舍入到0,即使结果是浮点数。我遵循的来源建议采用以下方法来解决这个问题:

float result = (float) numerator / denominator;

我现在想知道为什么这是有效的。特别是两件事。 1)如果你必须施放分子,你为什么不必投射分母呢? 2)为什么你不能把整个事情投入?我先尝试的是

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

但是这又将小数部分舍入为0。是什么原因?

4 个答案:

答案 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.04 / (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);

只要你将分子或分母投射到一个浮点数(或两者都是单独的),那么除法将使用浮点除法而不是整数除法来执行。