十二个人会有点低估.在我的机器上,以下结果是317个字符长的字符串:
#include <limits>
#include <cstdio>
#include <cstring>
int main()
{
double d = -std::numeric_limits<double>::max();
char str[2048] = "";
std::sprintf(str, "%f", d);
std::size_t length = std::strlen(str);
}
Run Code Online (Sandbox Code Playgroud)
使用%e14个字符长的字符串结果.
谁知道.double除了说它(3.9.1.8)"提供至少与浮点数一样多的精度"之外,标准没有说明精确数字的多少位数,所以你真的不知道你需要多少个字符来sprintf任意值.即使您确实知道实现提供了多少位数,仍然存在指数格式化等问题.
但这里有一个更大的问题.为什么你会关心?我猜这是因为你想写这样的东西:
double d = ...;
int MAGIC_NUMBER = ...;
char buffer[MAGIC_NUMBER];
sprintf(buffer, "%f", d);
Run Code Online (Sandbox Code Playgroud)
这是一个不好的方法,正是因为你不知道MAGIC_NUMBER应该有多大.你可以挑选一些足够大的东西,比如14或128k,但是你选择的数字是任意的,不是基于任何东西,只是猜测它会足够大.类似MAGIC_NUMBER的数字,并不令人惊讶,称为魔数.远离他们.他们会让你有一天哭.
相反,有很多方法可以进行这种字符串格式化,而不必关心缓冲区大小,精度数字等,这些让你可以继续编程的商业.流是一个:
#include <sstream>
double d = ...;
stringstream ss;
ss << d;
string s = ss.str();
cout << s;
Run Code Online (Sandbox Code Playgroud)
... Boost.Format是另一个:
#include <boost\format\format.hpp>
double d = ... ;
string s = (boost::format("%1%") % d).str();
cout << s;
Run Code Online (Sandbox Code Playgroud)