std::to_chars不支持科学计数法因C++17未定义std::chars_format::scientific,需手动拆解;固定小数位须缩放取整再格式化;buffer大小推荐double用100字节;返回指针非null-terminated,需手动处理终止符。
std::to_chars 是 C++17 引入的无分配、无 locale、纯计算型格式化函数,但它只支持两种模式:std::chars_format::fixed 和 std::chars_format::general(不是 scientific)。你传 std::chars_format::scientific 会编译失败——标准库目前根本不提供该枚举值。C++23 才正式加入 std::chars_format::scientific,但绝大多数生产环境(GCC 13 / Clang 16 / MSVC 19.3x)仍不支持或需手动开启实验性特性。
所以现在想用 std::to_chars 实现科学计数法,得自己拆解:先用 std::frexp 提取尾数和指数,再分别格式化尾数(general 或 fixed)+ 拼接 "e+" / "e-" + 指数部分。
固定精度(比如保留 3 位小数)不能靠 std::to_chars 的 precision 参数“直接控制”——它只对 fixed 和 general 有作用,且语义是“最多保留几位有效数字”,不是“小数点后几位”。要真正实现 %.3f 效果,必须手动缩放:
1000(对应 3 位),std::round 取整,再除回 1000.0,然后用 std::to_chars(..., std::chars_format::fixed)
std::to_chars 转成 general 格式,再用 std::from_chars 解析回 double,做缩放 + round,再转一次 —— 但性能损失大,一般不推荐std::to_chars 的原生行为:用 std::chars_format::fixed + 合理设置 precision(例如 precision=6 对应常见 float 精度),它会自动补零或截断,比手动 round 更符合 IEEE 浮点表示buffer 不够会导致返回 std::errc::value_too_large。别硬猜,用标准推荐方式:
立即学习“C++免费学习笔记(深入)”;
std::numeric_limits<int>::digits10 + 2</int>(+1 符号位,+1 结束符,但 std::to_chars 不写 '