【问题标题】:C/C++, truncating a small float number to 2 meaningful digits and expressing it in a scientific wayC/C++,将一个小的浮点数截断为2位有意义的数字,用科学的方式表达
【发布时间】:2014-02-28 10:22:24
【问题描述】:

我得到了一些小的浮点数,它们应该附加到文件名中。然后这些文件将显示在监控网站上。这样,人们可以仅通过文件名对实验运行有一个简要的印象。 一个典型的小数(真空压力的值)是:

1.2528168904794602e-07.

在 C/C++ 中,我希望它可以被截断为像这样的科学数字

1.3e-07

这个 1.3e-07 将是文件名的一部分。

我不想在屏幕上打印值。因此,可能无法选择使用以下 iostream 命令。

std::cout.precision(2);

有什么建议吗?谢谢!

【问题讨论】:

  • 如果您不显示该值,您在用它做什么?显示有效数字和科学格式仅在实际显示值时使用,仅存储值没有意义。
  • 好吧,我认为 std::io 有一个标志 (setiosflags(ios::scientific) ) 结合可以工作的精度。无论如何,您还可以将“流式传输到字符串中”以将该值存储为文件名的一部分
  • 您可以将值的二进制表示的适当位归零。似乎是个坏主意,但它应该可以完美地工作,因为浮点类型遵循 IEEE754 标准:)

标签: c++ truncation


【解决方案1】:

使用precisionsetf 的组合:

这就是你想要的:

#include <iostream>
using namespace std;

int main(){

  double pressure = 1.2528168904794602e-07;
  cout.setf(ios::scientific);
  cout.precision(1);
  cout << "pressure: " << pressure << endl;
}      

如果您正在写入文件,您仍然可以使用precision

#include <iostream>
#include <fstream>
using namespace std;

int main(){
  double pressure = 1.2528168904794602e-07;
  ofstream fout("out.txt");
  fout.setf(ios::scientific);
  fout.precision(1);
  fout << "pressure: " << pressure << endl;
  fout.close();
}    

这是一个使用该值写入输出文件的示例,该输出文件将该值作为文件名的一部分(使用stringstream 创建文件名):

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main(){
  double pressure = 1.2528168904794602e-07;
  ostringstream sout;
  sout.precision(1);
  sout.setf(ios::scientific);
  sout << "Prefix" << pressure << ".txt";
  ofstream fout(sout.str().c_str());
  fout << "Writing to outfile" << endl;
  fout.close();
}

以上代码创建了一个名为Prefix1.3e-07.txt的文件

如果我们无法使用 precision,您会如何处理?

【讨论】:

    【解决方案2】:

    感谢所有帖子! 我实际上是通过搜索弄清楚的。

    这是我的解决方案:

    ...
    string new_file_name;
    stringstream ss (stringstream::in | stringstream::out);
    ss << std::setprecision(1) << std::scientific << pressure_value ;
    string stest = ss.str();
    new_file_name += stest ;
    ...
    

    它和我的脚本不完全一样,但它是等价的。

    【讨论】:

    • 通过搜索而不是参考我方便放置的答案;-)?您不需要将ss.str() 放入一个新变量中,您只需说new_file_name += ss.str()
    • @AndyG,很抱歉你有这样的感觉。问题是我没有也不能在这里等待解决方案,对吗?与此同时,我试图自己弄清楚。我将ss.str() 分配给stest 的原因是我需要一个字符串类型来临时处理ss。因为new_file_name 不是字符串类型,所以是“TString”类型(在 OO 环境中定义 - 我的脚本在其下运行的 ROOT),它与字符串几乎相同但不完全一样。例如,new_file_name +=ss.str() 不起作用,因为“TString”类型没有str() 的功能,而字符串有。
    • 别担心,说真的,那是我的舌头。请不要将我的答案保留为已接受的答案,除非它为您解决了您的问题。感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2023-03-08
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多