在C++中将双精度转换为字符串时精度损失
Loss of Precision when Converting Double to String in C++
所以我知道在打印具有精确n
的双精度值时应该使用setprecision(int n)
。但是,我在我正在处理的一个项目中遇到了一个类似于以下代码的问题:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double var = 1.0000001;
cout << setprecision(10)<< var << endl;
string str = to_string(var);
cout << str << endl;
return 0;
}
这是输出:
1.0000001
1.000000
在我正在处理的项目中,我需要将双精度值保存为字符串,并且偶尔需要超过六位小数的精度。在这里,转换过程中显然会失去精度。任何指示将不胜感激。
您可以使用
std::stringstream
.
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main(void) {
double var = 1.0000001;
cout << setprecision(10)<< var << endl;
stringstream ss;
ss << setprecision(10) << var;
string str;
ss >> str;
cout << str << endl;
return 0;
}
如果您想获得双精度的全精度而不将其限制为特定值(由"偶尔需要超过六位小数"暗示),并且如果您正在使用 Boost 库,您还可以尝试以下替代方法:
#include <boost/lexical_cast.hpp>
#include <iostream>
using namespace boost;
using namespace std;
int main() {
double var = 1.0000001;
cout << lexical_cast<string>(var) << endl;
return 0;
}
这在我的一个应用程序中被证明是有用的,在这些应用程序中,精度确实很重要,并且由于使用了一些特定的日志记录函数包装器,std::stringstream
方法不是很方便和优雅。您可以在此处找到有关boost::lexical_cast
及其如何处理内部表示的更多信息。
显然,如果您当前没有在项目中使用 Boost,那么这种方法是矫枉过正的。
试试这个:
#include <sstream>
#include <string>
// In some function:
double d = 453.23;
std::ostringstream os;
os << d;
std::string str = os.str();
相关文章:
- 如何在C++中的同一函数中使用字符串和双精度
- C 字符串返回字符串的整数/双精度/长整型值
- 如何从字符串转换为双精度*
- C++如何将字符串逐行转换为双精度
- 如何在 C++ 中将双精度数组中的值"force convert"到字符串输出中?
- 在C++中将字符串转换为双精度,而无需科学记数法
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 如何在C++中将字符串转换为双精度?
- 将双精度值转换为 char 变量时字符串流如何工作
- 在 c++ 中从双精度转换为字符串
- 从字符串转换为双精度和整数 - C++
- 如何从char16_t字符串文字中读取双精度?
- 分析字符串中的双精度和单词
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- C++将包含非人类可读数据的字符串转换为 200 双精度
- 将大双精度转换为科学记数法以用作字符串?
- 字符串和双精度的麻烦,等值后再得到一个数字
- 如何从字符串流中提取双精度
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- 基于双函数的字符串精度