1

我刚开始使用Objective-C,以及一般的C,所以我想这也是一个C问题。这更像是一个为什么的问题而不是一个如何的问题。

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

float result = (float) numerator / denominator;

我现在想知道为什么会这样。特别是两件事。1)如果你必须投分子,为什么你不必须投分母呢?2)你为什么不能把整个东西都投下来?我首先尝试的是

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

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

4

4 回答 4

8

通过提升分子浮动,您也需要提升分母。但是,当您将两者放在括号中时,您就是在告诉编译器将工作作为整数然后转换为浮点数。

于 2013-05-07T17:32:15.957 回答
3

请参阅 C99 标准中的“常用算术转换”

基本上它说操作数必须是相同的类型,如果不是,它们会自动转换。

因此,在4 * 3.5;( 4type int) 中自动转换为4.0(type double)。
(double)4 / 7;7转换为7.0.
4 / (double)7;4转换为4.0.
(double)4 / (float)7;( 7.0Ftype float) 中被转换为7.0(type double)。
...

于 2013-05-07T17:42:42.287 回答
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
于 2013-05-07T17:34:37.630 回答
2

我相信你也可以改用分母,你会得到预期的结果。

float result = numerator / (float) denominator;

这会起作用,但没有必要。

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

这首先执行整数除法(因为操作数都是整数并且它们被包裹在括号中),然后将结果转换为浮点数。

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

只要您将分子或分母转换为浮点数(或两者都单独),那么除法将使用浮点除法而不是整数除法执行。

于 2013-05-07T17:50:22.513 回答