【问题标题】:Why does float divided by an integer return a float为什么浮点数除以整数返回浮点数
【发布时间】:2016-05-21 17:42:03
【问题描述】:

我正在学习 C。 我想知道为什么你会得到一个浮点数,即使你的一个变量是一个 int。

float x = 5.0;
int y = 2;

float result = x / y;

我的猜测是结果是 2.00000。但它确实返回一个浮点数 (2.500000)

我认为这将是 2.000000,因为如果你将 2 个整数相除,这就是结果。而且我认为,如果您使用 int 和 float 它会选择最不精确的值。

【问题讨论】:

  • 这是因为其中一个操作数是浮点数。这足以使操作成为浮点数。
  • 1) 因为一个操作数是一个浮点数。 2) 因为你已经写了float result - 为什么你会期望它是别的东西?
  • 减号在哪里发挥作用? ;) 为什么你会猜测或期望你的除法结果是2.00000
  • 请注意,表达式计算为某事,而不是返回某事。
  • 任何合理的原因让您认为强制转换为具有较小范围(不一定是较低精度)的类型更合乎逻辑?你知道任何这样的编程语言吗?

标签: c


【解决方案1】:

因为C的Usual arithmetic conversions

引用 ANSI C 标准 § 3.2.1.5 通常的算术转换:

许多期望算术类型的操作数的二元运算符会以类似的方式导致转换和产生结果类型。目的是产生一个公共类型,这也是结果的类型。这种模式称为通常的算术转换:首先,如果任一操作数的类型为 long double ,则另一个操作数将转换为 long double 。 [...] 否则,如果任一操作数的类型为 float,则另一个操作数将转换为 float。

强调我的。

【讨论】:

    【解决方案2】:

    运算符/ 仅在两个操作数都是整数时才执行整数除法。

    【讨论】:

      【解决方案3】:

      我认为如果你使用 int 和 float 它会选择最不精确的值。

      恰恰相反;一般规则是执行任何算术运算之前,两个操作数都被提升为参与运算的两个操作数中“最强大”的类型。

      “最强大”的类型是根据标准称为“常用算术转换”(C99,第 6.3.1.8 节)的规则确定的,它本质上是说 long double > double > float > 所有整数类型;如果表达式仅涉及整数类型,则需要一些其他规则来描述更长的时间(第 6.3.1.1 节)。

      现在,在您的情况下,您有一个int 和一个float,“最佳”类型是float,因此在执行除法之前int 被提升为float

      【讨论】:

      • 也许是“最强大的” -> “范围更广的类型”?
      【解决方案4】:

      如果除法中的一个操作数是 float 而另一个是整数(intlong 等),那么您的结果将是浮点数。

      这意味着,这将是一个浮点数除法:如果你将 5 除以 2,你会得到预期的 2.5。

      【讨论】:

        【解决方案5】:

        首先,result 是一个浮点数,所以它可以保存十进制值。

        其次,xy的操作数之一是浮点数,所以返回值是浮点数。这也适用于加法、乘法和减法。

        【讨论】:

          【解决方案6】:

          代码的结果是一个浮点数,因此它会产生一个浮点数。当您通过 anf int 划分 int 时,它将返回 2.5,但结果为 int 会将结果截断为 2

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-16
            • 2021-05-14
            • 1970-01-01
            • 2022-11-29
            • 2014-02-25
            • 2017-05-06
            • 2014-06-19
            • 2014-02-19
            相关资源
            最近更新 更多