如何在 c++ 中将字符串的确切内容分配给双精度
How to assign exact content of a string to a double in c++
我没有太多经验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) 与您的目的无关。值为零;时期。
调试器在将数字转换为可以用眼睛和大脑阅读的内容时,只是选择使用小数点后七位。使用 printf
或 std::cout
类似地输出数字进行读取时,您可以根据需要选择其他格式,包括具有两个小数位的格式以匹配原始字符串输入。这只是说同一件事的不同方式。
不要将价值与表示混淆。
此外,你坚持小数点后两位让我怀疑:如果你打算使用double
来存储货币,那就不要了。浮点类型不适合这样做。
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 在 C++ 中将双精度变量写入二进制文件
- 分配两个双精度值,保证产生相同的位集模式
- 将 Int 指针分配给双精度变量
- C++ - 泛型结构的成员在分配双精度时给出错误的值(但适用于整数)
- 由将值分配给双精度类型的变量而导致的浮点异常
- 分配给双精度的数字上的 F 后缀
- 为双精度值分配内存时出错
- 如何在 c++ 中将字符串的确切内容分配给双精度