Как преобразовать число double в string, сохранив десятичный вид?
В итоге строке содержится «1E-8». Как сохранить формат числа и получить строку «0.00000001»?
- Вопрос задан более трёх лет назад
- 8756 просмотров
Комментировать
Решения вопроса 1

Лучшая документация — исходники
https://msdn.microsoft.com/ru-ru/library/kfsatb94(v=vs.110).aspx
Ответ написан более трёх лет назад
kykyryky @kykyryky Автор вопроса
Видел эту страницу, но не разобрался.
Все чего добился, так это с помощью
string str = string.Format(«», x);
получил ответ с фиксированным числом знаков после запятой: «0.0000000100»

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

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