【问题标题】:Issues while printing float values打印浮点值时的问题
【发布时间】:2012-04-25 20:42:24
【问题描述】:
#include<stdio.h>
#include<math.h> 
int main()
{
   float i = 2.5;
   printf("%d\n%d\n%d",i,i,i);
}

当我使用 gcc 编译并运行它时,我得到这个作为输出:

0
1074003968
0

为什么不打印出来

2
2
2

【问题讨论】:

  • 您可能还想用-Wall -Wextra 编译您的代码。当我在打开警告的情况下编译该代码时,GCC 抱怨 format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’
  • 因为你对 printf() 撒了谎。你告诉它会有 3 个整数,但给了它 3 个浮点数。

标签: c++ c printf


【解决方案1】:

您将float(将转换为double)传递给printf,但告诉printf 期待int。结果是未定义的行为,因此至少在理论上,任何事情都可能发生。

通常会发生什么,printf 将从堆栈中检索 sizeof(int) 字节,并将它们持有的任何位模式解释为 int,并打印出发生的任何值代表。

您几乎肯定想要将float 转换为int,然后再将其传递给printf

【讨论】:

  • +1 用于实际解释发生的事情,而不仅仅是说“使用%f”。
【解决方案2】:

"%d" 格式说明符用于十进制整数。请改用"%f"

花点时间阅读printf() man page

【讨论】:

    【解决方案3】:

    “%d”是十进制整数(通常是 32 位整数)的说明符,而“%f”说明符用于十进制浮点。 (通常是双精度或浮点数)。

    如果您只想要浮点数的非小数部分,您可以将精度指定为 0。

    float i = 2.5;
    printf("%.0f\n%.0f\n%.0f",i,i,i);  
    

    请注意,您也可以将每个值转换为 int,它会给出相同的结果。

    printf("%d\n%d\n%d",int(i),int(i),int(i));
    

    【讨论】:

      【解决方案4】:

      %d 打印十进制 (int)s,而不是 (float)s。 printf() 不能告诉你传递了一个 (float) 给它(C 没有本地对象;你不能问一个值它是什么类型);您需要为您传递的类型使用适当的格式字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        相关资源
        最近更新 更多