Перевод double в string с заданной точностью

Рейтинг: 0Ответов: 2Опубликовано: 17.04.2023

Есть вот такая функция:

void DoubleToString(std::string &answer_for_return, double answer) {
    char *convertator = new char;
    sprintf(convertator, "%.7lf", answer);
    answer_for_return = convertator;
    delete convertator;
}

Делает, то что мне нужно, но в итоге получается утечка. Задавать сразу размер массива символов нельзя, наверное, ведь вдруг ответ будет слишком большой и не влезет.

Ответы

▲ 1

У вас не утечка, а попытка обращения за пределы доступной памяти. Вы можете сначала определить необходимый размер массива символов с помощью функции snprintf, которая принимает вторым параметром размер массива. Вы можете указать его равным нулю - тогда функция ничего не запишет, но вернёт количество символов, которое требуется для записи (не включая \0). Так вы определите, какой размер массива вам нужен. После этого создаёте массив нужной длины и выполняете конвертацию.

Вот пример:

void DoubleToString(std::string &answer_for_return, double answer) {
    int count = snprintf(nullptr, 0, "%.7lf", answer);
    if (count > 0)
    {
        char *convertator = new char[count+1];
        sprintf(convertator, "%.7lf", answer);
        answer_for_return = convertator;
        delete convertator;
    }
    
}

int main()
{
    std::string s;
    double a = 3434.33;
    DoubleToString(s, a);
    std::cout << s;
    return 0;
}
▲ 0

Для преобразования double в string с заданной точностью можно воспользоваться библиотекой <sstream>. Вот пример функции, которая это делает:

#include <sstream>

std::string doubleToString(double number, int precision) {
    std::ostringstream stream;
    stream.precision(precision);
    stream << std::fixed << number;
    return stream.str();
}

В этой функции мы используем std::ostringstream для записи числа в строку с заданной точностью. Метод precision устанавливает количество знаков после запятой, а метод std::fixed говорит о том, что нужно выводить фиксированную точку. Функция str() возвращает полученную строку.

Вы можете использовать эту функцию следующим образом:

double value = 3.14159265359;
std::string stringValue = doubleToString(value, 7);

В этом примере мы конвертируем число value в строку с точностью до 7 знаков после запятой и сохраняем результат в stringValue.


Конечно, можно использовать sprintf для преобразования double в string. Вот пример функции:

#include <cstdio>

std::string doubleToString(double number, int precision) {
    char buffer[50];
    sprintf(buffer, "%.*lf", precision, number);
    return std::string(buffer);
}

В этой функции мы используем sprintf, который записывает отформатированные данные в буфер символов buffer. Мы передаем точность как аргумент в метод sprintf и используем .* для динамического задания точности. Затем мы конвертируем буфер в объект std::string и возвращаем его.

Вы можете использовать эту функцию следующим образом:

double value = 3.14159265359;
std::string stringValue = doubleToString(value, 7);

В этом примере мы конвертируем число value в строку с точностью до 7 знаков после запятой и сохраняем результат в stringValue.