【问题标题】:Why do we separately cast to "float" in an integer division?为什么我们在整数除法中分别转换为“浮点数”?
【发布时间】:2014-12-28 06:54:04
【问题描述】:

例如:

int number1 = 1, number2= 2;
float variable = (float)number1/(float)number2;

取而代之的是,为什么我们不能只使用一次“float”?例如:

int number1 = 1, number2= 2;
float variable = (float)(number1/number2);

【问题讨论】:

  • 因为整数除法会截断。使用printf显示两个计算的结果,你会发现第一个结果是0.5,第二个结果是0.0,因为1/2被截断为0
  • 嗯,number1/number2 是整数除法。事实上,第二个示例中的(float) 没有任何区别。
  • 因为除法运算会在转换为浮点数之前截断小数位。
  • 子表达式的求值通常不受它出现的上下文的影响。因为number1number2 都是int 类型,所以(number1/number2) 使用int-by-int 除法计算。将结果转换为 float 不会改变这一点。

标签: c variables


【解决方案1】:

目标是避免整数除法带来的截断。这要求除法的至少一个操作数是浮点数。因此,您只需要对float 进行一次转换,但在正确的位置。例如,

float variable = number1/(float)number2; // denominator is float

float variable = ((float)number1)/number2; // numerator is float

请注意,在第二个示例中,为清楚起见,添加了一组额外的括号,但由于优先规则,它与

float variable = (float)number1/number2; // numerator is float, same as above

另请注意,在您的第二个示例中,

float variable = (float)(number1/number2);

float 的强制转换在整数除法之后应用,因此这并不能避免截断。由于表达式的结果无论如何都分配给了float,所以它就是

float variable = number1/number2;

【讨论】:

    【解决方案2】:

    你可以写任何一个表达式,但你会得到不同的结果。

    float variable = (float)(number1 / number2);variable中的值为0,因为除法是整数除法,1/2为0,转换结果。

    对于float variable = (float)number1 / (float)number2;variable 中的值为 0.5,因为除法是作为浮点除法完成的。

    float variable = (float)number1 / (float)number2; 中的任何一个都可以省略,结果相同;另一个操作数在除法之前从int 转换为float

    【讨论】:

      【解决方案3】:

      由于number1number2ints,执行的除法将是整数除法。因此,number1/number2 将评估为int 0。要改为进行浮点运算,您需要转换它们。请注意,简单地转换一个就足够了,因为另一个将被隐式提升。所以,你可以直接说((float)number1)/number2

      【讨论】:

        【解决方案4】:

        在第一种情况下,

        1/2 个结果 0

        在第二种情况下,你可以使用一次浮点数,但它必须在除法之前与其中一个数字一起应用

        1.0/2.0 或 1.0/2 或 1/2.0 结果 0.5

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-26
          • 1970-01-01
          • 2019-01-23
          相关资源
          最近更新 更多