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

Kal*_*imR 0 c printf

始终打印以下代码"0.00".我在期待"7888".我应该把它转换成double

long l = 7888;
printf("%.2f", l);
Run Code Online (Sandbox Code Playgroud)

Glo*_*del 13

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

long l = 7888;
printf("%.2f", (double)l);
Run Code Online (Sandbox Code Playgroud)

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


Sou*_*osh 8

%f期望a doublel变量很长.printf()没有它的参数转换由格式说明符所需的类型都按自己神奇.

FWIW,printf()是一个可变参数函数,默认参数促销规则适用于所提供的参数,它不改变longdouble,无论是.如果在所有的,你想要的转换发生,你必须明确的参数值.

你需要写一些类似的东西

printf("%.2f", (double)l);
Run Code Online (Sandbox Code Playgroud)

请注意,此代码调用未定义的行为,没有显式强制转换.参考C11,章节§7.21.6.1,fprintf()

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


dbu*_*ush 7

%f格式说明需要一个double,但你传递一个long,所以这是不确定的行为.

如果要正确打印,则需要使用%ld格式说明符将其打印为long:

printf("%ld", l);
Run Code Online (Sandbox Code Playgroud)

或者转换ldouble将其打印为浮点数:

printf("%.2f", (double)l);
Run Code Online (Sandbox Code Playgroud)