Как из float сделать string c
Перейти к содержимому

Как из float сделать string c

  • автор:

Как из float сделать string c

Нередко может возникнуть необходимость объединить строку с данными других типов, например, числами. Однако объединить строку мы можем только с другой строкой. Поэтому данные других типов вначале необходимо преобразовать в строку. Для преобразования в строку применяется функция std:to_string() , в которую передается преобразуемое значение:

#include #include int main() < unsigned age; std::string message< "Age: " + std::to_string(age)>; std::cout 

Функции преобразования из строки в число

Нередко может вощникнуть противиположная задача — преобразовать строку в другой тип. Есть ряд функций, которые преобразуют строку в число определенного типа:

  • stoi() : преобразует в тип int
  • stol() : в long
  • stoll() : в long long
  • stoul() : в unsigned long
  • stoull() : в unsigned long long
  • stof() : в float
  • stod() : в double
  • stold() : в long double

Все они определены в модуле , работают однотипно и в качестве параметра принимают преобразуемую строку:

std::string str< "123" >; int n< std::stoi(str) >; // n == 123

Преобразование строки в указатель на символы

При необходимости можно преобразовать значение типа string в указатель на символы. Для преобразования в указатель на константную строку применяется метод c_str() :

#include #include int main() < std::string message ; const char* message_ptr = message.c_str(); // преобразуем в указатель std::cout

Для получения указателя также можно применять метод data() , который возвращает указатель на неконстантное значение, если объект string не является константой.

#include #include int main() < std::string message ; char* message_ptr = message.data(); // преобразуем в указатель std::cout

Как конвертировать float/double в строку именно в том виде, в котором значение устновленно в переменной (без обрезки занков)?

Выводит «0.01234567», а надо «0.012345678900000». stringstream пробовал — результат тот же. std::to_string вообще 6 знаков пишет после точки. Точность заранее не известна, нужно выгружать в строку то, что есть, можно без нулей в конце. Как это сделать?

Отслеживать
задан 8 мая 2020 в 18:27
2,303 1 1 золотой знак 18 18 серебряных знаков 29 29 бронзовых знаков
А вы не задумывались, какова точность представления числа типом float ?
8 мая 2020 в 18:29
@Harry с double картина не меняется
8 мая 2020 в 18:31
Ну, вы вообще бредом занимаетесь — в пустой string что-то писать.
8 мая 2020 в 18:35

Ну, конкретное количество нулей справа — это вы никак не получите. У гугла есть библиотека, которая печататет числа с плавающей точкой за минимальное количество знаков, возможно это вам подойдет. (По идее, std::to_chars тоже должна так уметь, но пока ее завезли только в MSVC.)

8 мая 2020 в 18:58

1 ответ 1

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

float valf = 0.012345678900100; double vald = 0.012345678900100; printf("%.20f\n", valf); printf("%.20lf\n", vald); 
0.01234567910432815552 0.01234567890010000030 

В любом случае в силу того, что числа с плавающей точкой представлены в итоге виде суммы степеней двойки, ожидать, что введенный строковый литерал или результат вычисления будет равен чему-то конкретному, не приходится.

char buf[30]; sprintf(buf,"%.20lf",val); string s = buf; 
ostringstream os; os  

Только не пишите в никуда, как в вашем примере.

Update

К "артефактам", упомянутым в комментарии. Это не артефакты. Представим, что у нас есть возможность записи только 4 бит. Как вы представите, например, 1/5 в виде суммы дробей вида 1/2 n ?

1/8 + 1/16 + 1/128. Стоп! Уже не можем представить 1/128 - точности не хватает. Так что число 0.20 будет иметь вид 0.1875.

Это - ограничение самого представления. Ну невозможно в общем случае представить дробное число с помощью конечной суммы дробей вида 1/2 n .

Как из float сделать string c

AD>ЗЫ: правда получишь жуткие тормоза.

из-за чего?
(я хочу это использовать для генерации sql запросов)

Re[3]: Как правильно преобразовать float в string

От: ArtDenis
Дата: 01.05.03 13:43
Оценка: 2 (1)

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

AD>>ЗЫ: правда получишь жуткие тормоза.
AI>из-за чего?

#include #include const count = 10000; void test1() < std::string str; std::ostringstream tmp; int i; float value = 11.765765; for (i = 0; i < count; i++) < tmp.clear(); tmp > void test2() < std::string str; char buffer[64]; int i; float value = 11.765765; for (i = 0; i < count; i++) < sprintf(buffer, "%f", value); str = buffer; > >

Так вот test1 у меня отрабатывает за 2.7 секунд, test2 — за 0.025. Комментарии, я думаю, излишни.

AI>(я хочу это использовать для генерации sql запросов)

Для этого — в самый раз. Тем более, что ostringstream может растягиваться до любых (почти) размеров.

Re[4]: Как правильно преобразовать float в string

От: КАА
Дата: 01.05.03 15:06
Оценка:

Как насчет _gcvt() .
Все будет Украина!
Re: Как правильно преобразовать float в string

От: WFrag
Дата: 01.05.03 15:09
Оценка: 21 (2)

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

AI>я делаю так
AI>char cstring[10];
AI>float a=80.01;
AI>sprintf(cstring,"%f",a);
AI>std::string str=""+cstring+"";
AI>--------------------------------
AI>как правильно сделать
AI>а вот ещё так бы хотелось
AI>vector v(10);
AI>--------------------------------

А еще можно c помощью boost:

string str = lexical_cast( 1.2345f );

Re[5]: Как правильно преобразовать float в string

От: ArtDenis
Дата: 01.05.03 15:24
Оценка:

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

КАА>Как насчет _gcvt() .

А так же fcvt, ecvt. Каждый вибирает для себя наиболее удобный вариант. Все сишные реализации небезопасны с точки зрения вероятности записи за пределы буфера, зато они очень быстро работают. С ostringstream всё наоборот — он безопасен и многофункционален, но работает медленно.

Re[4]: Как правильно преобразовать float в string

От: Михаил Можаев www.mozhay.chat.ru
Дата: 01.05.03 23:48
Оценка: 6 (1)

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

AD>>>ЗЫ: правда получишь жуткие тормоза.
AD>Так вот test1 у меня отрабатывает за 2.7 секунд, test2 — за 0.025. Комментарии, я думаю, излишни.

А зачем так хитро? Попробуй так:

void test1() < std::string str; int i; float value = 11.765765; for (i = 0; i < count; i++) < std::ostringstream tmp; tmp >

И все уже не так плохо

Re[5]: Как правильно преобразовать float в string

От: ArtDenis
Дата: 02.05.03 05:59
Оценка:

Здравствуйте, Михаил Можаев, Вы писали:

ММ>

ММ>void test1() ММ> < ММ>std::string str; ММ> int i; ММ> float value = 11.765765; ММ> for (i = 0; i < count; i++) ММ> < ММ>std::ostringstream tmp; ММ> tmp str = tmp.str(); ММ> > ММ>> ММ>

ММ>И все уже не так плохо

В полтора раза быстрее

Re[2]: Как правильно преобразовать float в string

От: ArtDenis
Дата: 02.05.03 07:26
Оценка:

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

WF>А еще можно c помощью boost:
WF>

WF>string str = lexical_cast( 1.2345f ); WF>

2.3 секунды с lexical_cast против секунд 0.025 с sprintf

Re[3]: Как правильно преобразовать float в string

От: WFrag
Дата: 02.05.03 11:34
Оценка:

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

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

WF>>А еще можно c помощью boost:
WF>>

WF>>string str = lexical_cast( 1.2345f ); WF>>

AD>2.3 секунды с lexical_cast против секунд 0.025 с sprintf

AD>Денис.
Ну lexical_cast<> собственно вот по такому принципу и работает :

float a = 80.01; std::string str; std::stringstream tmp; tmp 

Re[4]: Как правильно преобразовать float в string

От: AI
Дата: 02.05.03 13:56
Оценка:

Cпасибо всем . я остановился на потоке ostringstream /
но у меня почему не дейтсует
tmp.clear();
то есть просиходит процесс добавления. пришлось каждый раз создавать новый

Re[5]: Как правильно преобразовать float в string

От: Павел Кузнецов
Дата: 02.05.03 14:26
Оценка: 12 (1)

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

A> остановился на потоке ostringstream /
A> но у меня почему не дейтсует tmp.clear();

tmp.clear() вместо ожидаемой тобой "очистки содержимого" просто-напросто сбрасывает флаг состояния. Используй

tmp.str(std::string());

Как перевести из float в string?

welcome32

У Вас еще есть странная проверка, Вы проверяете извините пробел, а если enter нажать? А если написать "Мама"?
Чекайте что это, строка или число, если число то в какой диапазон входит? Может это float?

Возьмите за правило "Все что я получаю извне или из внешних источников - это заранее спланированная провокация что бы убить мой код или вызвать крах программы"

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +3 ещё

Как получать данные из WebApp?

  • 1 подписчик
  • 6 часов назад
  • 21 просмотр

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

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