【问题标题】:Losing precision when concatenating from a double to a string in C++在 C++ 中从双精度连接到字符串时丢失精度
【发布时间】:2015-04-05 16:57:27
【问题描述】:

免责声明:我是一名新的 C++ 程序员,但我已经阅读了很多关于浮点数之类的内容,以及某些数字如何无法正确存储以及所有这些内容。在我的许多 Google 搜索中,我都找不到任何真正与此问题相关的内容。

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

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

user1 = 43.5803481
用户2 = -116.7406331

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

concat = 43.580348 -116.740633

如您所见,我丢失了每个变量末尾的 1。

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

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

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

所以我想我想知道:
(1) 为什么要这样做?(见编辑)
(2) 我该如何解决? (有没有更好的方法来做到这一点?等等)

提前感谢您查看此内容!

编辑:我现在了解到to_string 仅包含六位小数,但已链接的其他页面上的解决方案似乎无法解决我的问题。

【问题讨论】:

标签: c++ string double concatenation


【解决方案1】:

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

注意:出于文档目的,您需要将 #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;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2018-06-13
    • 2013-06-17
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多