在 C++ 中从双精度连接到字符串时丢失精度

Losing precision when concatenating from a double to a string in C++

免责声明:我是一个新的C++程序员,但我已经阅读了很多关于浮点数之类的东西以及一些数字如何不能正确存储以及所有那。在我的许多 Google 搜索中,我没能找到任何真正专门针对这个问题的内容。

好的,基本上就是标题所说的 - 当我将两个双精度变量连接成一个字符串时,我遇到了一个问题,它们在每个变量编号的末尾删除了一位小数。我正在做的是让用户输入两个数字(存储为双精度数)进行一些计算,但稍后在程序中我需要将这两个数字放在一个字符串中,这样我就可以在一个数组中搜索它们(我已经加载值)。当这些数字连接成一个字符串时,它们会删除它们两个值中的最后一位数字,这会导致搜索失败(我进行了一些调试以找到此问题)。

以下是我的变量在被用户赋值后立即读取的内容:

user1 = 43.5803481
user2 = -116.7406331

到目前为止,这些值都很好,下面是我将它们连接起来后的样子:

concat = 43.580348 -116.740633

如你所见,我在每个变量的末尾都去掉了 1。

这是我用来连接它们的代码:

concat = to_string(user1) + " " + to_string(user2);

我已经将变量 concat 声明为字符串和所有内容。

所以我想我在想:
(1) 为什么要这样做?(见编辑)
(2) 我该如何解决? (有更好的方法吗?等等)

在此先感谢您的关注!

编辑: 我现在明白 to_string 只保留小数点后六位,但链接的其他页面上的解决方案似乎没有解决我的问题。

我最终使用了下面的代码,它完全满足了我的需要 - 它采用双精度变量并将其更改为字符串,同时保持精度。

注意:出于文档目的,您需要将 #include <sstream> 包含到预处理器中才能正常工作。

template <class T>
string num2str(const T& num, unsigned int prec = 8) 
{
string ret;
stringstream ss;


ios_base::fmtflags ff = ss.flags();
ff |= ios_base::dec;
ff |= ios_base::fixed;
ff |= ios_base::basefield;
ss.flags(ff);
ss.precision(prec);
ss << num;
ret = ss.str();
return ret;
};