Можно ли установить точность результата при преобразовании double в строку с помощью std:: to_string()?
Точность std:: to_string (double)
Ответ 1
Нет.
Возвращает: каждая функция возвращает строковый объект, содержащий символьное представление значения его аргумент, который будет сгенерирован вызовом
sprintf(buf, fmt, val)
с помощью спецификатора формата"%d"
,"%u"
,"%ld"
,"%lu"
,"%lld"
,"%llu"
,"%f"
,"%f"
или"%Lf"
, соответственно, где buf обозначает внутренний буфер символов достаточного размера.
Ответ 2
Я считаю, что использование std::stringstream
с setprecision
было бы самым гибким/переносным выбором, но если вы знаете свои данные, в качестве обходного пути вы можете попытаться подстроить результат to_string
. Например:
std::string seriesSum(int n)
{
double sum = 0, div = 1;
for(int i = 0; i < n; i++) {
sum += 1.0 / div;
div += 3;
}
return std::to_string(round(sum * 100)/100).substr(0,4);
}
В приведенном выше коде я печатаю с двумя десятичными знаками 0.00
, беря первые 4 цифры строки, но это работает только потому, что я знаю, что целая часть никогда не будет превышать одну цифру. Вы также можете использовать string.find()
для поиска десятичного разделителя и использовать его для вычисления размера подстроки, что делает его более динамичным.
Ответ 3
Я просто искал решение этой проблемы, так как перегружал оператор std::cout <<
и поэтому было бы сложно сделать обходной путь std::stringstream
. Я решил свою проблему с помощью функции std::substr()
чтобы найти десятичное число и взять выбранное число цифр после него.
std::string trimmedString = std::to_string(doubleVal).substr(0, std::to_string(doubleVal).find(".") + precisionVal + 1);
Это даст вам "precisionVal" 0 после вашего числа.
Пример:
double doubleVal = 3;
int preisionVal = 2
3.000000
становится 3.00