文章

【GESP】C++一级知识点研究,scanf/printf浮点数格式化到底是%lf还是%f

最近做基础练习时频繁使用到scanfprintf函数。在对double类型变量进行输入输出时发现,scanf标准为 %lfprintf标准为 %f ,并且printf实际使用 %lf%f ,效果似乎一样,遂想弄清一二。

C++中关于double类型变量格式化符号标准

在C++中,使用 printf 输出 double 类型的值时,正确的格式化符是 %f,而不是 %lf

虽然在变量声明时,doublefloat 有区别,但 printf 在格式化时,%f 处理的是所有浮点数,包括 floatdouble。使用 %lf 只在 scanf 中用于读取 double 类型的值。

1
2
3
4
5
6
7
#include <cstdio>

int main() {
    double num = 3.14159;
    printf("%f\n", num);  // 正确,输出 3.141590
    return 0;
}

总结

  • printf 输出 double 类型的值时:用 %f
  • scanf 读取 double 类型的值时:用 %lf;读取 float类型的值时:用%f

对于printf,double类型值使用%f和%lf为何都有效

1. 历史原因与标准

在标准 C 库中,printf 规范中规定了 %f 作为格式化浮点数的通用符号,适用于 floatdouble 类型。事实上,float 类型在调用 printf 时,会被自动提升为 double(称为默认的“浮点数提升”)。因此,对于 printf 来说,处理的是 double 类型的数据,而不是 float,所以 %f 足够处理两者。

%lf 虽然表示长浮点数(long float),但在 printf 中它并不是标准格式。实际上 %lf 的使用行为与 %f 相同,因为 printf 不区分 floatdouble。这也是为什么你看到使用 %lf 也能正常输出 double 的原因,但标准要求应该使用 %f

2. 推荐使用 %f

即使在某些编译器下,%lf%f 都能正常输出 double,但根据标准 C/C++ 规范,推荐使用 %f 来格式化输出浮点数(包括 double)。

因此, printf 输出 double 时,规范推荐使用 %f,虽然 %lf 也能工作,但不属于标准规定。

本文由作者按照 CC BY 4.0 进行授权