首页 文章

printf中double的正确格式说明符

提问于
浏览
385

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

代码示例

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

6 回答

  • 18

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

    请注意,这是 printf 格式字符串与 scanf (和 fscanf 等)格式字符串显着不同的地方 . 对于输出,您传递一个值,当作为可变参数传递时,该值将从 float 提升为 double . 对于输入,你传递的指针是未提升的,所以你必须告诉 scanf 你是否要读 floatdouble ,所以对于 scanf%f 表示你想要读 float%lf 表示你想读a double (并且,对于 long double 的值,对于 printfscanf ,使用 %Lf ) .


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

    鉴于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年 . 上一版本的主要更改包括:printf中允许的%lf转换说明符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转换说明符适用于long double参数 .

    fprintf 指定的相同规则适用于 printfsprintf 和类似功能 .

    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 - >长双 .

  • 9

    %Lf (注意大写 L )是format specifier for long doubles .

    对于普通 doubles%e%E%f%g%G 都可以 .

  • -1

    对于双倍,你可以简单地使用 %lf ,或者你可以根据自己的喜好使用以下任何一种

    %e%E 表示指数格式的值

    %g%G 表示正常或指数表示法,以其大小为准 .

    在这里阅读更多List of all Format Specifier in C

  • 7

    double 的正确 printf 格式为 %lf ,与您使用的完全相同 . 您的代码没有任何问题 .

    C语言的旧(C99之前)版本不支持 printf 中的格式 %lf ,这在 printfscanf 中为 double 的格式说明符之间创建了表面"inconsistency" . 表面上的不一致已在C99中修复 .

    所以在现代C中,在 printfscanf 中使用 %ffloat%lfdouble%Lflong double 一致地使用是非常有意义的 .

  • 52

    它可以是 %f%g%e ,具体取决于您希望如何格式化数字 . 有关详细信息,请参阅here . l 修饰符在 scanf 中需要 double ,但不在 printf 中 .

相关问题