推荐用std::to_string转换数字,它简单安全,支持int、long、double等类型,如std::to_string(42)→"42";但需格式控制(如补零、科学计数)时应选std::stringstream。

直接用 std::to_string,别绕路——这是 C++11 起最简单、最安全、也最推荐的方式。流式转换(如 std::stringstream)只在需要格式控制(比如补零、科学计数、进制切换)或拼接混合类型时才值得上。
用 std::to_string 转整数和浮点数
它专为数字转字符串设计,支持 int、long、double 等内置数值类型,返回 std::string,无异常、无状态、无额外开销:
-
std::to_string(42)→"42" -
std::to_string(-17)→"-17" -
std::to_string(3.14159)→"3.14159"(注意:不控制精度,按默认浮点输出规则) - 不支持
char或自定义类型;传入char会转成 ASCII 数值(如std::to_string('a')得"97")
什么时候必须用 std::stringstream
当你需要格式化输出——比如固定小数位、十六进制、左对齐、补零等,std::to_string 就不够用了:
- 输出两位小数:
ss - 转十六进制:
ss →"ff" - 补零到 4 位:
ss →"0042" - 混合拼接:
ss - 注意:
std::stringstream默认保留前导空格和换行符;每次重用前建议调用ss.str("")清空内容,再调用ss.clear()重置错误标志
std::to_string 的精度陷阱(尤其浮点)
它不接受精度参数,输出的是“足够区分该浮点值的最短十进制表示”,但实际显示可能远超预期位数:
立即学习“C++免费学习笔记(深入)”;
-
std::to_string(0.1)返回"0.10000000000000001"(不是"0.1") - 这不是 bug,是 IEEE 754 浮点数无法精确表示 0.1 导致的必然结果
- 若需可控精度(如显示为
"0.10"),必须用std::stringstream+std::setprecision+std::fixed - 整数转字符串完全没这个问题——
std::to_string对整型是精确且高效的
别碰 itoa、gcvt 这类 C 风格函数
它们不是标准 C++,不可移植:itoa 是 MSVC/MinGW 扩展,GCC 不认;gcvt 在 C++23 中已被标记为废弃。即使临时能编译,也会在跨平台构建或升级编译器时突然失效。
真正容易被忽略的是浮点数格式化需求——很多人一开始用 std::to_string,直到 UI 上出现一长串小数才意识到要切回 std::stringstream。提前想清楚是否要控制输出形态,比事后调试更省时间。










