C/C++,将一个小浮点数截断为 2 个有意义的数字,并以科学的方式表达

C/C++, truncating a small float number to 2 meaningful digits and expressing it in a scientific way

本文关键字:数字 有意义 方式表 C++ 浮点数 一个      更新时间:2023-10-16

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

1.2528168904794602e-07.

在 C/C++ 中,我希望它可以被截断为科学数字,例如

1.3e-07

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

我没有尝试在屏幕上打印值。因此,使用以下 iostream 命令可能不是一个选项。

std::cout.precision(2);

有什么建议吗?谢谢!

使用 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的值?

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

这是我的解决方案:

...
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 ;
...

它与我的脚本不完全相同,但它是等效的。