printf 中双精度的正确格式说明符

问题描述 投票:0回答:5

double
printf
的正确格式说明符是什么?是
%f
还是
%lf
?我相信是
%f
,但我不确定。

代码示例

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}
c floating-point printf double format-specifiers
5个回答
796
投票

"%f"
是双精度数的(或至少一种)正确格式。 float 没有格式,因为如果您尝试将
float
传递给
printf
,则在
double
收到它
1
之前,它将被提升为
printf
"%lf" 在当前标准下也是可接受的——如果后面跟有
l
转换说明符(等等),
f
被指定为无效。

请注意,这是

printf

格式字符串与

scanf
(和
fscanf
等)格式字符串显着不同的地方。对于输出,您传递一个
value
,当作为可变参数传递时,它将从 float 提升为
double
。对于输入,您要传递一个
指针
,该指针不会被提升,因此您必须告诉 scanf 您是否想要读取
float
还是
double
,因此对于
scanf
%f
表示您想要读取
float
%lf
表示您想要读取
double
(并且,对于
long double
,您可以使用
%Lf
来表示
printf
scanf
)。


1. C99,§6.5.2.2/6:“如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并且具有 float 类型的参数将提升为 double。这些被称为默认参数提升。”在 C++ 中,措辞有些不同(例如,它不使用“原型”一词),但效果是相同的:所有可变参数在被函数接收之前都会经历默认提升。


66
投票
C99

标准(即N1256草案),规则取决于 函数类型:fprintf (printf, sprintf, ...) 或 scanf。 以下是摘录的相关部分:

前言

第二版取消并取代第一版 ISO/IEC 9899:1990,经 ISO/IEC 9899/COR1:1994、ISO/IEC 9899/AMD1:1995 和 ISO/IEC 9899/COR2:1996 修订和更正。 与上一版本相比的主要变化包括:

    %lf
  • printf
     中允许使用转换说明符
      
7.19.6.1

fprintf函数


  
  

7

长度修饰符及其含义是:

l

(ell) 指定 (...) 对后面的 a、A、e、E、f、F、g 或 G 转换说明符没有影响。

L

指定以下 a、A、e、E、f、F、g 或 G 转换说明符适用于长双精度参数。

fprintf

指定的相同规则适用于

printf
sprintf
和类似函数。

7.19.6.2

fscanf函数


  
  

11

长度修饰符及其含义是:

l

(ell) 指定 (...) 后面的 a、A、e、E、f、F、g 或 G 转换说明符适用于类型指针为 double 的参数;

L

指定以下 a、A、e、E、f、F、g 或 G 转换 说明符适用于类型指针指向 long double 的参数。

12

转换说明符及其含义是: a,e,f,g 匹配可选带符号的浮点数,(...)

14

转换说明符 A、E、F、G 和 X 也是有效的,并且其行为分别与 a、e、f、g 和 x 相同。

长话短说,对于
fprintf

,指定了以下说明符和相应的类型:


    %f
  • -> 双
  • %Lf
  • -> 长双。
    
    
    
  • 对于
fscanf

来说是:


    %f
  • -> 浮动
  • %lf
  • -> 双
  • %Lf
  • -> 长双。
    
        

37
投票
%f

%g
%e
,具体取决于您希望数字的格式。请参阅
此处
了解更多详情。 l 修饰符在
scanf
double
中是必需的,但在
printf
中不需要。
    


21
投票
%lf

printf
的完全正确的
double
格式,与您使用的完全一样。你的代码没有任何问题。

旧版(C99 之前)C 语言不支持 
%lf

中的

printf

 格式,这在 
double
 中的 
printf
scanf
 中的格式说明符之间造成了表面上的“不一致”。这种表面上的不一致已在 C99 中得到修复。 
您无需将 
%lf

double

 中的 
printf
 一起使用。如果您愿意,也可以使用 
%f
%lf
%f
printf
 中是等效的)。但在现代 C 中,更喜欢使用 
%f
float
%lf
double
 以及 
%Lf
long double
 一起使用,在 
printf
scanf
 中保持一致。


13
投票
(注意大写

L

)是
长双精度数
格式说明符 对于普通 doubles

,可以使用

%e

%E
%f
%g
%G

© www.soinside.com 2019 - 2024. All rights reserved.