如何在 c++ 中将字符串的确切内容分配给双精度

How to assign exact content of a string to a double in c++

本文关键字:分配 双精度 c++ 字符串      更新时间:2023-10-16

我没有太多经验C++,我有以下问题。使用以下代码:

double d = 0.0000000;
stringstream ss;
ss << std::fixed << std::setprecision( 2 ) << d;
ss >> d;

std::string content = ss.str();
d = atof( content.c_str()  );

在MS Visual Studio中进行调试时,两种方式中的任何一种,我看到d的值0.0000000不像字符串content那样0.00

如何获得分配给双 d 的字符串的确切内容?

也许我应该问一个更广泛的问题:

我正在编写一个根据需要精确返回双精度的方法。例如,如果我有 2.446343434 作为 d 的值并且精度为 2,我如何让我的方法返回 d 为 2.45?

看完下面的回答:我才知道做这样的事情是不可能的。所以下一个问题是:

即使我上面的代码试图将 2.45 放入双精度,C++运行时也会将零(多少?)附加到 2.45 并返回对吗?有没有办法控制将零附加到双精度?

我看到 d 的值是 0.0000000 而不是字符串中的 0.00

但这两个数字具有完全相同的值。因此,一个数字可以具有值 0.0000000,当且仅当它也具有值 0.00。

如何获得分配给双 d 的字符串的确切内容?

你不能。 double表示数值。它表示字符串。

此外,在更一般的情况下,这是不可能的,因为浮点数不能表示可以用字符串表示的所有数字。但这不是 0 的问题,它确实是可以表示的。

我正在编写一个根据需要精确返回双精度的方法。例如,如果我有 2.446343434 作为 d 的值和精度为 2,我怎样才能让我的方法返回 d 为 2.45

您无法让方法返回值为 2.45 的双精度值,除非double的格式可以表示 2.45 。IEEE 754指定的二进制64格式不能表示2.45。在这种情况下,您能做的最好的事情是返回最接近具有 2 个有效小数位的数字的可表示数字,在 IEEE 754 的情况下,该数字为 2.45000000000000017763568394003。您问题中的程序实现了这一目标。

如果这不是您想要的,那么浮点不适合您的用例。

您在

调试器中看到的人类可读d值"0.0000000"只是一个表示形式,而且是一个相当任意的表示形式。实际的 double 对象不存储此字符串,也不存储具有固定小数位数的任何内容

在最低级别,它的实际标识是 (a) 二进制,(b) 根据浮点规范编码,以及 (c) 与您的目的无关。值为零;时期。

调试器在将数字转换为可以用眼睛和大脑阅读的内容时,只是选择使用小数点后七位。使用 printfstd::cout 类似地输出数字进行读取时,您可以根据需要选择其他格式,包括具有两个小数位的格式以匹配原始字符串输入。这只是说同一件事的不同方式。

不要将价值与表示混淆。

此外,你坚持小数点后两位让我怀疑:如果你打算使用double来存储货币,那就不要了。浮点类型不适合这样做。