将浮点数转换为字符串,并指定精度和十进制数字数?
Convert float to string with precision & number of decimal digits specified?
如何在C++中将浮点转换为字符串,同时指定精度&小数位数?
例如:3.14159265359 -> "3.14"
一种典型的方法是使用stringstream
:
#include <iomanip>
#include <sstream>
double pi = 3.14159265359;
std::stringstream stream;
stream << std::fixed << std::setprecision(2) << pi;
std::string s = stream.str();
参见固定
使用固定浮点表示法
将str流的
floatfield
格式标志设置为fixed
。当
floatfield
设置为fixed
时,浮点值使用定点表示法写入:该值在小数部分中的位数与精度字段(precision
)指定的位数完全相同,并且不包含指数部分。
和设置精度。
对于技术目的的转换,如将数据存储在XML或JSON文件中,C++17定义了to_chars函数族。
假设有一个兼容的编译器(在编写时我们缺少),可以考虑这样的东西:
#include <array>
#include <charconv>
double pi = 3.14159265359;
std::array<char, 128> buffer;
auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi,
std::chars_format::fixed, 2);
if (ec == std::errc{}) {
std::string s(buffer.data(), ptr);
// ....
}
else {
// error handling
}
做这类事情的常用方法是"打印到字符串"。在C++中,这意味着使用std::stringstream
,类似于:
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
您可以使用C++20 std::format
:
#include <format>
int main() {
std::string s = std::format("{:.2f}", 3.14159265359); // s == "3.14"
}
或{fmt}库中的fmt::format
函数,std::format
基于(godbolt):
#include <fmt/core.h>
int main() {
std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14"
}
其中CCD_ 12是精度。
它不仅比使用iostreams或sprintf
更短,而且速度更快,而且不受语言环境的影响。
免责声明:我是{fmt}和C++20 std::format
的作者。
另一个选项是snprintf
:
double pi = 3.1415926;
std::string s(16, ' ');
auto written = std::snprintf(&s[0], s.size(), "%.2f", pi);
s.resize(written);
演示。应添加错误处理,即检查written < 0
。
这里是一个仅使用std的解决方案。但是,请注意,这只是四舍五入。
float number = 3.14159;
std::string num_text = std::to_string(number);
std::string rounded = num_text.substr(0, num_text.find(".")+3);
对于rounded
,它产生:
3.14
该代码将整个浮点转换为字符串,但将所有字符在"."
这里我提供了一个反例,在将浮点数转换为字符串时,您需要避免这个反例。
float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;
你得到
99463 99.463 99.462997
注意:num变量可以是接近99.463的任何值,您将得到相同的打印结果。重点是避免使用方便的c++11"to_string"函数。我花了一段时间才摆脱这个陷阱。最好的方法是字符串流和sprintf方法(C语言)。C++11或更新版本应提供第二个参数,作为要显示的浮点之后的位数。目前默认值为6。我这样做是为了其他人不会在这个问题上浪费时间。
我写了我的第一个版本,如果你发现任何需要修复的错误,请告诉我。您可以使用iomaniferator控制精确的行为。我的功能是显示小数点后的位数。
string ftos(float f, int nd) {
ostringstream ostr;
int tens = stoi("1" + string(nd, '0'));
ostr << round(f*tens)/tens;
return ostr.str();
}
您可以使用fmt库。
3.14159265359->quot;3.14";
#include <fmt/format.h>
#include <string>
double pi = 3.14159265359;
std::string st = fmt::format("pi = {:.2f}", pi);
- 如何计算整数的十进制数字?
- Unicode Chars显示为十进制数字而不是符号,我该如何修复
- 根据参数设置十进制数字
- 将二进制号转换为十进制数字的代码
- 使用动态比特斯转换十进制数字
- 此代码中 * 1233 >> 12 计算十进制数字背后的数学原理是什么
- 仅使用char将八分音号码转换为十进制数字
- 将十进制数字截断为最接近的4个小数和断言
- 打印长双变量的所有十进制数字
- 十进制数字的区域设置感知编辑控件子类化(格式[sign][xxx..][decimal separator][yy.])
- 如何存储具有一定精度的数字
- 减少C++中双精度的数字
- 将双精度转换为精度超过 5 位十进制数字的字符串
- 将双十进制数字转换为HEX字符串
- 如何确定浮点数中的最后一个非零十进制数字
- 分配给双精度的数字上的 F 后缀
- 双精度:大数字的乘法运算
- 编写一个宏is_digit,如果其参数是十进制数字,则返回true
- 以 32 个十进制数字分析浮点数/双精度
- 如何计算出大双精度中有多少个十进制数字