【GESP】C++一级知识点研究,scanf/printf浮点数格式化到底是%lf还是%f
最近做基础练习时频繁使用到scanf和printf函数。在对double类型变量进行输入输出时发现,scanf标准为 %lf 而printf标准为 %f ,并且printf实际使用 %lf 和 %f ,效果似乎一样,遂想弄清一二。
C++中关于double类型变量格式化符号标准
在C++中,使用 printf 输出 double 类型的值时,正确的格式化符是 %f,而不是 %lf。
虽然在变量声明时,double 和 float 有区别,但 printf 在格式化时,%f 处理的是所有浮点数,包括 float 和 double。使用 %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 作为格式化浮点数的通用符号,适用于 float 和 double 类型。事实上,float 类型在调用 printf 时,会被自动提升为 double(称为默认的“浮点数提升”)。因此,对于 printf 来说,处理的是 double 类型的数据,而不是 float,所以 %f 足够处理两者。
%lf 虽然表示长浮点数(long float),但在 printf 中它并不是标准格式。实际上 %lf 的使用行为与 %f 相同,因为 printf 不区分 float 和 double。这也是为什么你看到使用 %lf 也能正常输出 double 的原因,但标准要求应该使用 %f。
2. 推荐使用 %f
即使在某些编译器下,%lf 和 %f 都能正常输出 double,但根据标准 C/C++ 规范,推荐使用 %f 来格式化输出浮点数(包括 double)。
因此, printf 输出 double 时,规范推荐使用 %f,虽然 %lf 也能工作,但不属于标准规定。
本文由作者按照 CC BY-NC-SA 4.0 进行授权
