C++中打印双精度的最大宽度

Cen*_*noc 4 c++

我想知道,使用fprintf打印双倍的字符数是多长?我猜是错的.

提前致谢.

Jam*_*lis 8

十二个人会有点低估.在我的机器上,以下结果是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个字符长的字符串结果.


Joh*_*ing 6

谁知道.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)