【问题标题】:Why the division of two integers return 0.00? [duplicate]为什么两个整数相除返回 0.00? [复制]
【发布时间】:2015-06-03 06:04:08
【问题描述】:

每次我运行这个程序时,我都会得到不同且奇怪的结果。这是为什么呢?

#include <stdio.h>

int main(void) {
    int a = 5, b = 2;
    printf("%.2f", a/b);
    return 0;
}

【问题讨论】:

    标签: c printf format-specifiers


    【解决方案1】:
    printf("%.2f", a/b);
    

    除法的输出再次是int 类型,而不是float

    1. 您使用了错误的格式说明符,这将导致未定义的行为。
    2. 您需要具有浮点类型的变量才能执行您正在执行的操作。

    打印出int 的正确格式说明符是%d

    【讨论】:

      【解决方案2】:

      在您的代码中,ab 的类型为 int,因此除法本质上是整数除法,结果是 int

      您不能随时使用错误的格式说明符。 %f 要求对应的参数是double 类型。您需要将%d 用于int 类型。

      FWIW,使用错误的格式说明符调用 undefined behaviour

      来自C11 标准,第 7.21.6.1 章,fprintf()

      如果任何参数不是相应转换规范的正确类型,则行为未定义。

      如果你想要一个浮点除法,你需要明确地这样做

      • 在除法前提升变量之一以强制浮点除法,其结果将是浮点类型。

        printf("%.2f", (float)a/b);
        
      • ab 使用float 类型。

      【讨论】:

      • 恕我直言.. 只是回答这一点是好的.. 添加这么多信息以获得简单的答案是不必要的,并且可能会导致 OP 混淆
      • 恕我直言,这个答案并非只是适用于 OP。它可能对将来访问的人有用。你永远不会知道。 :-)
      【解决方案3】:

      您需要将类型更改为浮点或双精度。

      类似这样的:

      printf("%.2f", (float)a/b);
      

      IDEONE DEMO

      %f 格式说明符用于float。使用错误的格式说明符会导致您出现未定义的行为。 int 除以一个 int 会给你一个 int。

      【讨论】:

        【解决方案4】:

        用这个代替你的 printf()

        printf("%.2lf",(double)a/b);
        

        【讨论】:

        • 抱歉,为什么你需要double
        • 我们也可以使用浮点数。在涉及小数时使用双精度数只是我的习惯。
        • 对,如果您不提,只是将float 更改为double,它可能给OP 留下错误的印象。只是说。
        猜你喜欢
        • 2016-09-29
        • 1970-01-01
        • 2021-12-30
        • 2013-02-27
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多