Objective c 为什么在除以两个整数时,只有将分子转换为浮点才能获得浮点商?

Objective c 为什么在除以两个整数时,只有将分子转换为浮点才能获得浮点商?,objective-c,c,clang,Objective C,C,Clang,我刚从Objective-C开始,一般来说是C,所以我想这也是一个C问题。它更像是一个为什么的问题,而不是如何的问题 我注意到,在除以两个整数时,小数部分向下舍入为0,即使结果是一个浮点。我遵循的来源建议使用以下方法来处理此问题: float result = (float) numerator / denominator; 我现在想知道为什么这样做有效。特别是两件事。1)如果你必须计算分子,为什么不同时计算分母呢2)你为什么不能把整件事都抛出去呢?我首先尝试的是 float result =

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

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

float result = (float) numerator / denominator;
我现在想知道为什么这样做有效。特别是两件事。1)如果你必须计算分子,为什么不同时计算分母呢2)你为什么不能把整件事都抛出去呢?我首先尝试的是

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

但这再次将小数部分四舍五入到
0
。原因是什么?

通过将分子提升为浮动,您也需要提升分母。但是,当您将这两个变量放在paren中时,您告诉编译器将其作为整数执行,然后将其转换为float。

通过将分子提升为float,您也需要提升分母。但是,当你把这两个变量放在paren中时,你告诉编译器先把它们作为整数进行运算,然后把它们转换成浮点。

因为在第一种情况下,在分子被转换成浮点后,分母对于除法运算会自动升级为浮点。但是在第二种情况下,除法的结果应为整数,因为分子和分母都是整数。在第二种情况下,任何小数部分都会被截断,这是在将结果转换为浮点之前完成的。因此,只有第一个部分会生成正确的结果,而第二个部分会生成截断的结果

  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
float result = numerator / (float) denominator;

因为在第一种情况下,在将分子强制转换为
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
float result = numerator / (float) denominator;
请参阅C99标准中的

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

因此,在
4*3.5
4
(type
int
)自动转换为
4.0
(type
double
)。
(双)4/7中
7
转换为
7.0

在<代码>4/(双)7
4
转换为
4.0

(双)4/(浮点)7中
7.0F
(type
float
)转换为
7.0
(type
double
)。
…参见C99标准中的

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

因此,在
4*3.5
4
(type
int
)自动转换为
4.0
(type
double
)。
(双)4/7中
7
转换为
7.0

在<代码>4/(双)7
4
转换为
4.0

(双)4/(浮点)7中
7.0F
(type
float
)转换为
7.0
(type
double
)。

我相信你也可以用分母来代替,你会得到预期的结果

  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
float result = numerator / (float) denominator;
这会起作用,但没有必要

float result = (float) numerator / (float) denominator;
这将首先执行整数除法(因为操作数都是整数,并且都用括号括起来),然后将结果转换为浮点

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

只要你将分子或分母转换成浮点数(或分别转换成两者),那么除法将使用浮点除法而不是整数除法来执行。

我相信你也可以转换分母,你会得到预期的结果

  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
float result = numerator / (float) denominator;
这会起作用,但没有必要

float result = (float) numerator / (float) denominator;
这将首先执行整数除法(因为操作数都是整数,并且都用括号括起来),然后将结果转换为浮点

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

只要将分子或分母转换为浮点数(或分别将两者转换为浮点数),则将使用浮点除法而不是整数除法执行除法。

当然,应该有“float sum=(float)(5/2);”在最后一行。当然,应该有‘float sum=(float)(5/2);’在最后一行。每当我看到你的名字,我就忍不住想起LMG。LMG是世界上许多地方布伦机枪的俚语。呸!法特!法特!法特!法特!,作为童子军,我们每个人都可以挤一秒钟。每当我看到你的名字,我就忍不住想起LMG。LMG是世界上许多地方布伦机枪的俚语。呸!法特!法特!法特!法特!,作为童子军,我们可以每人挤一秒钟。