C++ C++;:将双精度/浮点转换为字符串,保留科学的符号和精度

C++ C++;:将双精度/浮点转换为字符串,保留科学的符号和精度,c++,C++,我正在尝试将双精度/浮点数转换为字符串。其中一些数字包含科学符号“e”,我想在转换后保留它。我搜索了google和stackoverflow,没有找到与我的用例匹配的答案 以下是一些示例和预期输出: input: 1.7976931348623157e+308 output: "1.7976931348623157e+308" 这是一个完整的main.cc文件,可以编译: #include <iostream> #include <sstream> #include &

我正在尝试将双精度/浮点数转换为字符串。其中一些数字包含科学符号“e”,我想在转换后保留它。我搜索了google和stackoverflow,没有找到与我的用例匹配的答案

以下是一些示例和预期输出:

input: 1.7976931348623157e+308
output: "1.7976931348623157e+308"
这是一个完整的
main.cc
文件,可以编译:

#include <iostream>
#include <sstream>
#include <string>

template <typename T>
std::string ToString(T value) {
  std::stringstream out;
  out << std::fixed;
  out << value;
  return out.str();
}

int main () {
    double mydouble = 1.7976931348623157e+308;
    std::cout << ToString(mydouble) << std::endl;
}
不是预期的“1.7976931348623157e+308”

--------过时的----------------

但输出是一个奇怪的字符串:

"179769313486231610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000ÍÍÍÍÍÍÍÍýýýý««««««««««««««««îþîþîþîþ"
两件事:

如果你想要科学记数法,固定不是你想要的。恰恰相反

当我编译

#include <iostream>
#include <sstream>

template <typename T>
inline std::string ToString(T value) {
    std::stringstream out;
    out << std::fixed;  
    out << value;
    return out.str();
}
int main()  
{
    double mydouble = 1.7976931348623157e+308; 
    std::cout << ToString(mydouble) << std::endl; 
}

是正确的,这意味着C++编译器或标准库中有一个bug。

< P>两件事:

如果你想要科学记数法,固定不是你想要的。恰恰相反

当我编译

#include <iostream>
#include <sstream>

template <typename T>
inline std::string ToString(T value) {
    std::stringstream out;
    out << std::fixed;  
    out << value;
    return out.str();
}
int main()  
{
    double mydouble = 1.7976931348623157e+308; 
    std::cout << ToString(mydouble) << std::endl; 
}

是正确的,这意味着C++编译器或标准库中有一个bug。

< p>你的代码运行良好。如果输出中有垃圾值,则可能在其他地方存在堆栈损坏

#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>

template <typename T>
inline std::string ToString(T value) {
  std::stringstream out;
  out << std::fixed;  
  out << value;
  return out.str();
}

int main() {
  double mydouble = 1.7976931348623157e+308; 
  std::cout << boost::lexical_cast<std::string>(mydouble) << '\n'; 
  std::cout << ToString(mydouble) << '\n';
}
#包括
#包括
#包括
模板
内联标准::字符串到字符串(T值){
std::stringout;

out您的代码运行正常。如果输出中有垃圾值,则可能在其他地方存在堆栈损坏

#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>

template <typename T>
inline std::string ToString(T value) {
  std::stringstream out;
  out << std::fixed;  
  out << value;
  return out.str();
}

int main() {
  double mydouble = 1.7976931348623157e+308; 
  std::cout << boost::lexical_cast<std::string>(mydouble) << '\n'; 
  std::cout << ToString(mydouble) << '\n';
}
#包括
#包括
#包括
模板
内联标准::字符串到字符串(T值){
std::stringout;

找出函数返回的类型??共享一个可验证的示例!现在,使此示例成为可验证示例的唯一方法是显示如何调用
ToString
,以及如何处理结果以获得输出。@benjaminz如果做得很好,请添加
main()…
函数显示了一个我们可以编译以重新创建的示例!试图让IOStreams生成可靠格式的小数就像试图让一个高中生发布一个体面的堆栈溢出问题-边界im-BLOOD-MABLE。显示一个不同的
ToString
实现有什么意义您正在使用的一个?这没有任何意义。您的函数返回的类型是什么?请共享一个可验证的示例!现在,唯一可以使此示例成为可验证的示例的是显示如何调用
ToString
,以及如何处理结果以获得输出。@benjaminz如果您做得很好,请添加
main()…
函数显示了一个我们可以编译以重新创建的示例!试图让IOStreams生成可靠格式的小数就像试图让一个高中生发布一个体面的堆栈溢出问题-边界im-BLOOD-MABLE。显示一个不同的
ToString
实现有什么意义你正在使用的一个?这没有任何意义。啊!我明白了。我刚刚把
注释掉了啊!我明白了。我刚刚把
注释掉了