C中使用printf实现等价于C++ std::setprecision(n)的方法
printf动态设置浮点数输出精度的实现方法
printf原生支持动态精度配置,不需要手动拼接格式字符串,只要在格式符的精度位置用*占位,再把精度值作为参数按顺序传入即可,可以完全匹配C++ setprecision(n)的输出效果。
匹配你给出的示例的写法
你提供的C++示例用的是cout默认浮点输出规则:按总有效数字位数计数、自动省略无意义尾零、数值过大/过小时自动切换科学计数法,和printf的%g格式符行为完全一致,等价代码如下:
#include <cstdio> int main() { double pi = 3.14159265358979323846; int n; scanf("%d", &n); printf("%.*g\n", n, pi); return 0; }
注意参数顺序:*对应的精度参数n,必须放在待输出的浮点数参数前面。
其他输出场景的对应写法
如果需要匹配cout的其他浮点输出格式,对应写法如下:
- 匹配
cout << fixed << setprecision(n)(固定小数格式,指定小数点后保留n位):使用%.*f格式符,例如n=3时执行printf("%.*f", n, pi);会输出3.142 - 匹配
cout << scientific << setprecision(n)(科学计数法格式,指定有效位数):使用%.*e格式符,例如n=5时执行printf("%.*e", n, pi);会输出3.14159e+00
注意事项
- 传入的精度值必须是int类型,不要传入浮点数作为精度参数,否则会触发未定义行为
- 优先用
*占位的写法实现动态精度,不要手动把数字拼接成格式字符串,这种写法是C标准明确规定的通用用法,无安全风险、全平台兼容。
内容的提问来源于stack exchange,提问作者Mohammad Farseen
相关产品推荐
相关产品推荐

