Установить точность std::to_string при преобразовании значений с плавающей запятой

В C++11 для std::to_string по умолчанию используется 6 знаков после запятой. входное значение типа float или double. Каков рекомендуемый или самый элегантный метод изменения этой точности?


person learnvst    schedule 17.05.2013    source источник


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