Преобразование float в строку с заданной точностью и количеством десятичных цифр?


Как преобразовать float в строку в C++ при указании точности и количества десятичных цифр?

например: 3.14159265359 -> "3.14"

4 51

4 ответа:

#include <iomanip> // setprecision
#include <sstream> // stringstream

double pi = 3.14159265359;
stringstream stream;
stream << fixed << setprecision(2) << pi;
string s = stream.str();

посмотреть основные

используйте фиксированную нотацию с плавающей запятой

задает флаг str поток fixed.

, когда floatfield установлено значение fixed, значения с плавающей запятой записываются с использованием фиксированной точки нотации: значение представлено ровно столько цифр в десятичной части, как указано точности поле (precision) и без экспонентная часть.

и setprecision.

обычный метод для выполнения такого рода вещей - это "печать в строку". В C++ это означает использование std::stringstream что-то типа:

std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();

другой вариант:snprintf:

double pi = 3.1415926;

std::string s(16, '');
auto written = std::snprintf(&s[0], s.size(), "%.2f", pi);
s.resize(written);

демо. Следует добавить обработку ошибок, т. е. проверку на written < 0.

здесь я предоставляю отрицательный пример, где вы хотите избежать при преобразовании плавающего числа в строки.

float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;

вы получаете

99463 99.463 99.462997

Примечание: переменная num может быть любым значением, близким к 99.463, вы получите ту же распечатку. Дело в том, чтобы избежать удобной функции c++11 "to_string". Мне потребовалось время, чтобы выбраться из этой ловушки. Лучший способ-это методы stringstream и sprintf (язык C). В C++11 или более поздней версии должны предоставляться второго параметра как количество цифр после плавающей точки, чтобы показать. Сейчас по умолчанию-6. Я утверждаю это так, чтобы у других не было времени на эту тему.

Я написал свою первую версию, пожалуйста, дайте мне знать, если вы обнаружили ошибку, которую необходимо исправить. Вы можете контролировать точное поведение с помощью иоманипулятора. Моя функция предназначена для отображения количества цифр после десятичной точки.

string ftos(float f, int nd) {
   ostringstream ostr;
   int tens = stoi("1" + string(nd, '0'));
   ostr << round(f*tens)/tens;
   return ostr.str();
}