0

0

c++中如何将浮点数float转换为string_c++浮点数转字符串

尼克

尼克

发布时间:2026-01-04 19:11:10

|

194人浏览过

|

来源于php中文网

原创

std::to_string 会丢失精度,应使用 std::ostringstream 或 std::to_chars;通过 std::fixed + std::setprecision(n) 可精确控制小数位数,scientific 则控制有效数字位数。

c++中如何将浮点数float转换为string_c++浮点数转字符串

直接用 std::to_string 会丢失精度,尤其对小数位数少或科学计数法表示的值;真正可控、可预测的转换得靠 std::ostringstream 或 C++17 的 std::to_chars

std::ostringstream 精确控制格式

这是最常用也最灵活的方式,能指定小数位数、固定/科学格式、填充等。默认构造的 std::ostringstream 用的是默认浮点格式(defaultfloat),但输出可能截断末尾零或切掉多余小数位,需手动设置。

  • std::fixed + std::setprecision(n) 控制小数位数(如保留 6 位)
  • std::scientific 切换科学计数法
  • std::setprecisionfixed 表示小数位数,对 scientific 表示总有效数字位数
  • 记得 #include
float f = 3.1415926f;
std::ostringstream oss;
oss << std::fixed << std::setprecision(6) << f;
std::string s = oss.str(); // "3.141593"

std::to_chars(C++17 起)—— 零分配、高性能

这是目前最快、最底层的转换方式,不依赖流、不抛异常、不分配内存,但只支持十进制,且需要你预分配足够大的缓冲区(至少 10 字节存 float)。返回值是 std::to_chars_result,要检查 ec 是否为 std::errc::value_too_large

  • 缓冲区长度必须 ≥ std::numeric_limits::max_digits10 + 8(通常取 32 字节足够)
  • 它不补零、不格式化,输出是“最短精确表示”(如 1.0f"1",不是 "1.000000"
  • 适合高频、嵌入式或性能敏感场景
float f = 0.1f;
char buf[32];
auto [ptr, ec] = std::to_chars(buf, buf + sizeof(buf), f);
if (ec == std::errc{}) {
    std::string s(buf, ptr); // "0.10000000149011612"
}

为什么不用 std::to_string(float)

它内部调用 printf-style 格式化,对 float 先提升为 double,再按 double 精度转字符串,且固定输出 6 位小数(%f 风格),导致:

墨狐AI
墨狐AI

5分钟生成万字小说,人人都是小说家!

下载

立即学习C++免费学习笔记(深入)”;

  • std::to_string(0.1f) 得到 "0.100000"(看似正常,实则掩盖了实际二进制精度)
  • std::to_string(1e-5f) 得到 "0.000010",而真实值是 0.000009999999747378752,丢失了关键误差信息
  • 无法控制是否显示尾随零、是否用指数形式

兼容旧编译器(C++11/14)的稳妥写法

若不能用 C++17,又不想引入第三方库(如 fmt),就封装一个基于 std::ostringstream 的函数,并统一处理常见需求:

  • 默认保留 9 位有效数字(floatmax_digits10)以保证反向解析不歧义
  • 避免 std::fixed 导致大数变成一长串整数(如 1e6f"1000000.000000"
  • 优先用 std::defaultfloat + std::setprecision(std::numeric_limits::max_digits10)
std::string float_to_string(float f) {
    std::ostringstream oss;
    oss << std::setprecision(std::numeric_limits::max_digits10) << f;
    return oss.str();
}
// float_to_string(1.23456789f) → "1.23456787"

真正要注意的是:浮点数本质是二进制近似,任何字符串表示都是某种取舍。选哪种方式,取决于你更在意可读性、可逆性,还是性能——别让 std::to_string 的“方便”掩盖了精度问题。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

554

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

97

2025.10.23

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

72

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

279

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1462

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

612

2023.11.24

C++ 高性能计算与并行编程
C++ 高性能计算与并行编程

本专题专注于 C++ 在高性能计算(HPC)与并行编程中的应用,涵盖多线程、并发数据处理、OpenMP、MPI、GPU加速等技术。通过实际案例,帮助开发者掌握 如何利用 C++ 进行大规模数据计算和并行处理,提高程序的执行效率,适应高性能计算与数据密集型应用场景。

5

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.2万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号