Подтвердить что ты не робот

Точность std:: to_string (double)

Можно ли установить точность результата при преобразовании double в строку с помощью std:: to_string()?

4b9b3361

Ответ 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