什么';将双精度值转换为最简洁的字符串表示形式的最快或最有效的方法是什么? 我尝试编写一个C++函数,它输入任意双值,并将其转换成满足三个要求的字符串: 当字符串转换回double时,它将与原始double的值完全相同 字符串的长度尽可能短 字符串不使用科学符号,例如0.00123而不是1.23e-3
我已经实现了这个功能,但使用了我想到的第一个天真的方法:什么';将双精度值转换为最简洁的字符串表示形式的最快或最有效的方法是什么? 我尝试编写一个C++函数,它输入任意双值,并将其转换成满足三个要求的字符串: 当字符串转换回double时,它将与原始double的值完全相同 字符串的长度尽可能短 字符串不使用科学符号,例如0.00123而不是1.23e-3,c++,string,performance,double,memory-efficient,C++,String,Performance,Double,Memory Efficient,我已经实现了这个功能,但使用了我想到的第一个天真的方法: #include <string> #include <sstream> using namespace std; string doubleToString(double d, int precision) { ostringstream ss; ss.setf(ios_base::fixed); ss.precision(precision); ss << d;
#include <string>
#include <sstream>
using namespace std;
string doubleToString(double d, int precision)
{
ostringstream ss;
ss.setf(ios_base::fixed);
ss.precision(precision);
ss << d;
return ss.str();
}
string convertDoubleToStringConciselyAndAccurately(double d)
{
// a precision of 325 seems to be accurate enough to represent any double,
// as the minimum positive double value has an exponent of -324 (at least
// on the platforms I care about)
const int maxPrecision = 325;
for(int precision = 1; precision < maxPrecision; ++precision) {
string possibleResult = doubleToString(d, precision);
double d2 = atof(possibleResult.c_str());
if (d == d2) {
cout << precision << "\n";
return possibleResult;
}
}
return doubleToString(d, maxPrecision);
}
在C++17中,我相信您可以只使用指定的
std::chars\u format::fixed
。您尝试过吗?@NathanOliver std::to\u string创建的字符串比我的经验中创建的字符串长得多。Ex 12->“12.000000”@NathanOliver,这似乎不符合我的要求。例如std::to_string(1.2)
将返回1.200000
而不是1.2
。对精度有什么要求吗?例如,0.300000000004
是“有点长”,您可能会说,并希望改为“0.3”,因为它与正确的值之间的距离小于1LP。这不是一个简单的问题。专家们对此非常了解。是一些很好的信息和代码。
string convertDoubleToStringConciselyAndAccurately(double d)
{
const int maxPrecision = 325;
int minPrecision = 1;
if (d < 0.1) {
minPrecision = (int)floor(-log10(d));
}
for(int precision = minPrecision; precision < maxPrecision; ++precision) {
string possibleResult = doubleToString(d, precision);
double d2 = atof(possibleResult.c_str());
if (d == d2) {
return possibleResult;
}
}
return doubleToString(d, maxPrecision);
}