Как конвертировать float/double в строку именно в том виде, в котором значение устновленно в переменной (без обрезки занков)?
Выводит «0.01234567», а надо «0.012345678900000». stringstream пробовал — результат тот же. std::to_string вообще 6 знаков пишет после точки. Точность заранее не известна, нужно выгружать в строку то, что есть, можно без нулей в конце. Как это сделать?
Отслеживать
задан 8 мая 2020 в 18:27
2,273 1 1 золотой знак 16 16 серебряных знаков 27 27 бронзовых знаков
А вы не задумывались, какова точность представления числа типом 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
Нравится ресурс?
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.
Модераторы: ElcnU
'> хочется преобразовать float в string , а нет ли стандартной функции??
Из float в string
float vs string
в общем есть такая конструкция FILE* pfi; char* fn = "D:/test.txt"; pfi= fopen(fn,"w+");.

Преобразовать из float в string
Скажите, пжл, какие существуют ф-ии для конвертации из float в string?
Преобразовать string в float
Привет! Подскажите, пожалуйста, наиболее простой способ, как преобразовать значение типа string в.

Конвертирования float в string
Доброго времени суток. кто может обяснить что означает каждая строка. string *ch = new string.
Конвертация float в string
Нужно конвертировать float в string и конвертировать часто.
Я конечно могу каждый раз значение вводить в строковый поток, из него в строку, а потом поток очищать, но мне кажется, что это слишком много действий для такой задачи.
С to_string из библиотеки string что-то не так, когда ей подаёшь float. Вот пример, что она делает:
1 2 3 4
float a = 10; string s; s = to_string(a); cout s;
Выводит вместо 10, 10.000000
Можно ли как-то заставить функцию работать нормально с переменными с плавающей точкой, и не приписывать фантомные нули?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Конвертация string в float
string to float или double обычная консоль как перевести

Конвертация типов. float в string/char
Помогите реализовать! Для примера возьмем: У меня есть двумерный массив типа float (Primer1) и.

Конвертация IBM float в IEEE float
Добрый день, Мне необходимо конвертировать IBM float в IEEE float. По этой ссылке.
Конвертация Float to wchar_t
Здравствуйте, уважаемые форумчане. Помогите, мне, пожалуйста. Как правильно перевести float в.
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
David_G, Всё нормально выводит (см. скрин).
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
Возможно, надо покопаться с локалью. Но не уверен на 100%. Под Виндой работаешь?
Регистрация: 18.09.2020
Сообщений: 148
Так это не нормально! Тебе дают десятку, ты выводишь десятку, без всяких нулей, мне нужна просто десятка, тип integer применить не могу.
5006 / 4686 / 985
Регистрация: 11.10.2019
Сообщений: 12,251
David_G,
1 2 3 4 5 6 7
#include int main() { float a = 10; std::cout a; }
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
David_G, а, так тебе надо отсекать нулевую дробную часть?!
Нарушитель
8936 / 4800 / 1111
Регистрация: 12.03.2015
Сообщений: 22,645
sprintf() подойдёт?
Регистрация: 18.09.2020
Сообщений: 148
Так смотрите, повторяю ещё раз, у меня есть float a = 10; Мне просто надо чтобы эта десятка без всяких нулей, которых там и не было оказалась в строке.
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746

Сообщение было отмечено David_G как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13
#include #include #include int main() { float a = 10; std::string s; if (std::trunc(a) == a) s = std::to_string(static_castlong>(a)); else s = std::to_string(a); std::cout ; return 0; }
Регистрация: 18.09.2020
Сообщений: 148
Это конечно костыли, но спасибо. Откуда вообще эта функция видит нули там, где их нет.
Нарушитель
8936 / 4800 / 1111
Регистрация: 12.03.2015
Сообщений: 22,645
Сообщение от David_G 
Это конечно костыли
Ещо какие! Попробуй вывести float a = 10.5; .
Сообщение от David_G 
Откуда вообще эта функция видит нули там, где их нет.
Отсюда.
Я ж предложил решение, какого МПХ ты его проигнорил?
Регистрация: 18.09.2020
Сообщений: 148
Проигнорил из-за того, что я не знаю эту функцию, а при попытке поиска выводит что-то страшное, во что мне даже лезть не хочется, мне нужен был быстрый и лёгкий метод, который будет часто использоваться.
А 10.5 он выводит нормально, не зря же товарищ jugu поставил ветвление на if else, чтобы дробные числа нормально также выводились.
Нарушитель
8936 / 4800 / 1111
Регистрация: 12.03.2015
Сообщений: 22,645
Сообщение от David_G 
Проигнорил из-за того, что я не знаю эту функцию
Кликните здесь для просмотра всего текста

Вопросов больше нет.
Нарушитель
8936 / 4800 / 1111
Регистрация: 12.03.2015
Сообщений: 22,645
Сообщение от David_G 
А 10.5 он выводит нормально, не зря же товарищ jugu поставил ветвление на if else, чтобы дробные числа нормально также выводились.
Ты врёшь.
Вложение 1217156
Зачем ты врёшь?
Нарушитель
8936 / 4800 / 1111
Регистрация: 12.03.2015
Сообщений: 22,645
Сообщение от David_G 
А 10.5 он выводит нормально, не зря же товарищ jugu поставил ветвление на if else, чтобы дробные числа нормально также выводились.
Зачем ты врёшь?
Регистрация: 12.07.2021
Сообщений: 3
Пример из моей программы, дабы можно было регулировать количество нулей их удалением c положения после точки. coef+=2; - сохранение десятой части, +3 сотой и т.д. чтобы не было десятой просто break;
в данном случае остается десятая часть. все что придумал
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#include #include using namespace std; int main(){ int coef=0; float speed=20.3465; string speed_screen=""; speed_screen = to_string(speed); cout speed_screen "\n\n"; while(true){ cout coef " \n"; if(speed_screen[coef]=='.'){ coef+=2; break; } else coef++; } cout coef " \n"; cout speed_screen '\n'; speed_screen.erase(coef,5); cout speed_screen; }
![]()
![]()
11126 / 6084 / 1663
Регистрация: 18.10.2014
Сообщений: 15,294
Сообщение от David_G 
ожно ли как-то заставить функцию работать нормально с переменными с плавающей точкой, и не приписывать фантомные нули?
Преобразование с форматом std::defaultfloat придется делать классическим способом через stringstream . Не понятно, почему он до сих пор не упомянут
1 2 3
std::ostringstream ss; ss a; std::string s = ss.str();
но std::defaultfloat будет давать не более 6 значащих цифр.
Ну и начиная с С++20 у нас есть std::format .
600 / 616 / 96
Регистрация: 29.05.2015
Сообщений: 3,812
Написать функцию, которая получит число float, переведёт в строку и сократит (округлит?) до требуемого количества знаков.
600 / 616 / 96
Регистрация: 29.05.2015
Сообщений: 3,812
Или использовать нормальный современный ЯП, который сам рисует как надо:
![]()
![]()
36833 / 19881 / 4166
Регистрация: 12.02.2012
Сообщений: 33,015
Записей в блоге: 13
Сообщение от David_G 
Откуда вообще эта функция видит нули там, где их нет.
- неверная постановка вопроса! Что значит "нулей нет"? Это зависит от того, какой формат нужен.
Смотрю на обсуждение. Все крутится вокруг того, какой библиотекой воспользоваться. А самому написать нужное преобразование (если библиотечные не устраивают) слабО?
Вот как вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#include #include #include using namespace std; string flo2str(double f, int fsz=14) { char sgn,sgp,a; string mant="",decp=""; int i,p,q; double d; if (f0) { sgn='-'; f=fabs(f); } else sgn=' '; p=0; if (f>1.0) { while(f>=1.0) { f=f/10.0; p++; } } else if (f0.1) { while(f0.1) { f=f*10.0; p--; } } // Мантисса mant=mant+sgn+"0."; for (i=1; ifsz; i++) { q=modf(f*10.0,&d); a='0'+d; mant=mant+a; f=f*10-d; } // Порядок if (p0) mant=mant+"e-"; else mant=mant+"e+"; if (p==0) mant=mant+"00"; else { p=abs(p); for (i=1; i3; i++) { q=p%10; a='0'+q; decp=a+decp; p=p/10; } } return mant+decp; } int main() { double x=1234.56789; string z=flo2str(x,7); cout ; return 0; }