Как перевести double в string c
Перейти к содержимому

Как перевести double в string c

  • автор:

Как преобразовать число double в string, сохранив десятичный вид?

В итоге строке содержится «1E-8». Как сохранить формат числа и получить строку «0.00000001»?

  • Вопрос задан более трёх лет назад
  • 8756 просмотров

Комментировать

Решения вопроса 1

winordie

Лучшая документация — исходники

https://msdn.microsoft.com/ru-ru/library/kfsatb94(v=vs.110).aspx

Ответ написан более трёх лет назад

kykyryky @kykyryky Автор вопроса

Видел эту страницу, но не разобрался.
Все чего добился, так это с помощью
string str = string.Format(«», x);
получил ответ с фиксированным числом знаков после запятой: «0.0000000100»

winordie

как вариант
double x = 0.00000001;
string str = x.ToString(«0.###################»);

winordie

еще так
double x = 0.00000001;
string str = ((decimal)x).ToString();

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

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

Отслеживать
4,725 4 4 золотых знака 28 28 серебряных знаков 53 53 бронзовых знака
задан 17 апр 2023 в 9:22
ChetNePolichaetsa ChetNePolichaetsa
35 4 4 бронзовых знака

Вы в самом деле боитесь, что потребуется строка больше, скажем, килобайта? (ну, чтоб с бешшшшеным запасом :)). А выделение памяти через ne по сравнению с выделением и удалением ее в стеке — весьма дорогостоящая операция.

17 апр 2023 в 11:48

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

У вас не утечка, а попытка обращения за пределы доступной памяти. Вы можете сначала определить необходимый размер массива символов с помощью функции 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()

Отслеживать
ответ дан 17 апр 2023 в 9:43
4,725 4 4 золотых знака 28 28 серебряных знаков 53 53 бронзовых знака

Интересно, ТС реально планирует использовать «%.70000lf» , что боится использовать массив заранее заданного размера в стеке, что и куда быстрее, и проще.

17 апр 2023 в 11:42

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

#include std::string doubleToString(double number, int precision)

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

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

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

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

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

#include std::string doubleToString(double number, int precision)

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

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

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

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

Как перевести double в string c

в ответ компилятор выдает error: ‘lexical_cast’ was not declared in this scope
что-то нужно «include»? или может есть функция наподобие atof() только в обратную сторону?
пробовал поискать на тему — активно обсуждаются sprintf(), но это не вариант.

С уважением, Андрей
Re: Конвертировать double в string

От: Pasternak
Дата: 11.06.08 11:02
Оценка:

Здравствуйте, DukeNukem3D, Вы писали:

DND>Делаю так:

DND>

DND>string strTmp; DND>double dNum = 123.456; DND>strTmp = lexical_cast(dNum); DND>

DND>в ответ компилятор выдает error: ‘lexical_cast’ was not declared in this scope
DND>что-то нужно «include»? или может есть функция наподобие atof() только в обратную сторону?
DND>пробовал поискать на тему — активно обсуждаются sprintf(), но это не вариант.

Re: Конвертировать double в string

От: php-coder http://slava-semushin.blogspot.com
Дата: 11.06.08 11:05
Оценка:

Здравствуйте, DukeNukem3D, Вы писали:

DND>Делаю так:

DND>

DND>string strTmp; DND>double dNum = 123.456; DND>strTmp = lexical_cast(dNum); DND>

DND>в ответ компилятор выдает error: ‘lexical_cast’ was not declared in this scope
DND>что-то нужно «include»?

Насколько понимаю, нужно

#include 
using boost::lexical_cast;
strTmp = lexical_cast (dNum)

Re: Конвертировать double в string

От: Were
Дата: 11.06.08 11:33
Оценка:

Здравствуйте, DukeNukem3D, Вы писали:

DND>или может есть функция наподобие atof() только в обратную сторону?

Re: Конвертировать double в string

От: chipmunk
Дата: 11.06.08 11:48
Оценка: +1

можно ещё так:

std::string toString(double d) < std::ostringstream out; out return out.str(); >

Re[2]: Конвертировать double в string

От: Roman Odaisky
Дата: 11.06.08 12:10
Оценка:

Здравствуйте, chipmunk, Вы писали:

C>можно ещё так:
C>

C>std::string toString(double d) C> < C>std::ostringstream out; C> out return out.str(); C>> C>

Это и есть boost::lexical_cast, только через одно место.
До последнего не верил в пирамиду Лебедева.
Re[3]: Конвертировать double в string

От: chipmunk
Дата: 11.06.08 12:17
Оценка:

Здравствуйте, Roman Odaisky, Вы писали:

RO>Это и есть boost::lexical_cast, только через одно место.

ну а если проект не использует boost ? не подключать же его ради одного конвертирования

Re[2]: Конвертировать double в string

От: minorlogic
Дата: 11.06.08 14:05
Оценка: +1

Здравствуйте, chipmunk, Вы писали:

templatetypename Type> std::string toString(const Type& d) < std::ostringstream out; out return out.str(); >

Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Конвертировать double в string

От: Vamp
Дата: 11.06.08 14:21
Оценка:

DND>пробовал поискать на тему — активно обсуждаются sprintf(), но это не вариант.
А почему sprintf нехорош? Можно сделать обертку, которая будет спринтф внутри вызывать.

Да здравствует мыло душистое и веревка пушистая.
Re: Конвертировать double в string

От: DukeNukem3D
Дата: 16.06.08 09:53
Оценка:

Оказалось с моим компилятором не идет в комплекте библиотека boost — пришлось доставить вручную, синтаксис на самом деле таков strTmp = boost::lexical_cast(dEffectiveSum);

Как перевести double в string c

Как получить из переменной типа Double массив char’ов (в MS VC++)?
Нашёл следующее:

string TypeToStr(const double &rhs)

То есть можно потом преобразовать string в массив char. Выглядит иррационально.
Ещё вариант:

char buff [100]; double val = 1.234; sprintf (buff, "%f", val); "cout 

Тут есть опасения выхода за пределы буфера.
Или функции:
char* _ecvt(double value, int count, int* dec, int* sign);
char* _fcvt(double value, int count, int* dec, int* sign);
char* _gcvt(double value, int digits, char* buffer);
тут либо точность задавать жёстко либо буфер опять, да и вообще не очень понятно.
Так нет ли способа получить на выходе из функции *char, чтоб он указывал на массив содержащий просто все цифры числа и точку, отделяющую дробную часть?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *