为什么printf打印的值不正确?

时间:2015-07-30 12:18:43

标签: c printf

以下代码始终打印"0.00"。我期待"7888"。我应该将其转换为double吗?

long l = 7888;
printf("%.2f", l);

5 个答案:

答案 0 :(得分:13)

%.2f不是long的有效格式。你可以把它加倍:

long l = 7888;
printf("%.2f", (double)l);

Here是一个表格(向下滚动一下),您可以在其中查看所有数字类型允许的代码。

答案 1 :(得分:8)

%f预计doublel变量很长。 printf()不会将其参数转换为格式说明符 all-by-yourself 所需的类型。

FWIW,printf()variadic function,默认参数提升规则适用于提供的参数,并且它也不会将long更改为double。如果有的话,你希望转换发生,你必须明确地投射参数值。

你需要写一些像

这样的东西
printf("%.2f", (double)l);

请注意,此代码会调用undefined behaviour,而不会使用显式强制转换。参考,C11,章节§7.21.6.1,fprintf()

  

[....]如果有任何论据   不是相应转换规范的正确类型,行为是未定义的。

答案 2 :(得分:7)

%f格式说明符需要double,但您要将long传递给%ld,以便进行未定义的行为。

如果要正确打印,则需要使用long格式说明符将其打印为printf("%ld", l);

l

或将double转换为printf("%.2f", (double)l); 以将其打印为浮点数:

{{1}}

答案 3 :(得分:3)

I was expecting "7888".

这是因为您尝试使用FLOAT标识符打印LONG。 如果您打开设置,编译器会抱怨:

program.c:5:5: error: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘long int’ [-Werror=format=]
     printf("%f", l);
     ^
cc1: all warnings being treated as errors

Should I convert it to double?

顺便说一下,如果这是你真正需要的话,你也可以施展它。

我认为这是你真正需要的:

#include<stdio.h>

int main(void){
    long l = 7888;
    printf("%ld", l);
    return 0;
}
  

7888

答案 4 :(得分:1)

你不能使用浮点标识符打印一个长的proberly。你想做什么?