如何为std::cout设置等效于printf %g标志的输出格式?
如何让std::cout输出浮点数时等效于printf的%g格式?
平时用printf("%g", x)输出浮点数时,会自动选择人类易读的普通格式或指数格式(根据数值大小选更简洁的表示),同时自动去掉末尾无意义的零。但对于无法修改operator<<实现的point_2d类,要让std::cout输出它时达到printf("(%g; %g)", p.x, p.y)的效果,需要给std::cout设置以下参数:
核心设置(C++11及以上推荐)
直接使用C++11引入的std::defaultfloat格式标志,它完全对应%g的行为:
// 设置浮点数自动选择普通/指数格式,等效于%g的自动切换逻辑 std::cout << std::defaultfloat; // 设置有效数字精度为6位,和%g的默认精度一致 std::cout.precision(6); // 确保不强制显示末尾的零和多余的小数点 std::cout.unsetf(std::ios::showpoint);
兼容C++03的写法
如果需要兼容C++03标准(无std::defaultfloat),可以手动设置格式标志:
// 设置有效数字精度为6位 std::cout.precision(6); // 将浮点数格式设置为自动选择定点/指数模式 std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield); // 取消强制显示小数点和末尾零的设置 std::cout.unsetf(std::ios::showpoint);
完成以上设置后,执行std::cout << point_2d_instance << std::endl;的输出效果,就会和printf("(%g; %g)", p.x, p.y)完全一致。
内容的提问来源于stack exchange,提问作者one_two_three
相关产品推荐
相关产品推荐

