C/C++, усекая небольшое число с плавающей точкой до 2 значащих цифр и выражая его научным способом

Я получил несколько небольших чисел с плавающей точкой, которые должны быть добавлены к именам файлов. Эти файлы затем будут отображаться на веб-сайте мониторинга. Таким образом, люди могут получить краткое представление об экспериментальном прогоне исключительно по его имени. Типичное небольшое число (значение вакуумного давления):

1.2528168904794602e-07.

Я надеюсь, что в C/C++ его можно обрезать до научного числа, такого как

1.3e-07

Этот 1.3e-07 будет частью имени файла.

Я не пытаюсь напечатать значение на экране. В результате использование следующей команды iostream может оказаться невозможным.

std::cout.precision(2);

Какие-либо предложения? Спасибо!

2 ответа

Используйте комбинацию precision а также setf:

Это делает то, что вы хотите:

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

Это не совсем то же самое, что мой сценарий, но это эквивалентно.

Другие вопросы по тегам