В C++11 для std::to_string
по умолчанию используется 6 знаков после запятой. входное значение типа float
или double
. Каков рекомендуемый или самый элегантный метод изменения этой точности?
Установить точность std::to_string при преобразовании значений с плавающей запятой
Ответы (1)
Невозможно изменить точность с помощью to_string()
, но с помощью setprecision
манипулятора ввода-вывода вместо этого можно использовать:
#include <sstream>
template <typename T>
std::string to_string_with_precision(const T a_value, const int n = 6)
{
std::ostringstream out;
out.precision(n);
out << std::fixed << a_value;
return out.str();
}
person
hmjd
schedule
17.05.2013
Хорошо, но было бы здорово иметь возможность сделать это без создания временной строки. :/ Особенно в очень, очень тесном внутреннем цикле.
- person 3Dave; 01.02.2014
не перемещается ли внутренняя строка неявно, будучи возвращенным rval?
- person Jules G.M.; 19.08.2014
Я получаю 3e+01 для случая 33,33~, даже используя только n = 1.
- person Jonny; 27.10.2015
Чтобы обеспечить количество цифр, также необходимо передать std::fixed. См. пример на cplusplus.com/reference/iomanip/setprecision.
- person RED SOFT ADAIR; 02.12.2015
Использование струны в узком внутреннем цикле — плохая идея. Выделение памяти очень медленное. Вы пытаетесь использовать 1 выделение памяти вместо 2 выделений памяти, избегая временного. Вы пытаетесь избежать выделения памяти, если вам нужна производительность, используя sprintf и буфер, выделенный стеком. :-)
- person Joe; 10.05.2016
Вам не нужен
iomanip
для этого: просто используйте out.precision(n); out << a_value;
. Использование iomanip
не требует набора текста даже меньше.
- person Ruslan; 06.12.2017
Если вы хотите автоматически выбрать наилучшую доступную точность, вы можете использовать
const unsigned int digits = std::numeric_limits<T>::digits10;
вместо целого числа n.
- person Azrael3000; 19.11.2019
Когда я попытался,
float x = 107.2; cout<<to_string(x)
дал 107.199997. Это нормально?
- person Yunus Temurlenk; 16.08.2020