С: Как реализовать вывод вещественных чисел без незначащих нулей?
Если нужно по-простому, то вроде бы нельзя. А вот написать собственную версию вывода чисел с плавающей запятой очень даже можно. Кое-какие костыли на этот счёт обсуждались здесь: stackoverflow.com/questions/277772/…
16 окт 2019 в 18:18
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если просто, то что-то в таком духе
avp@avp-xubu2:~/hashcode$ cat t.c && gcc t.c && echo "===== result =====" && ./a.out #include #include char * fz (double f, char *s) < sprintf(s, "%f", f); char *p = strrchr(s, '0'); if (p && !p[1]) while (*p == '0') *p-- = 0; return s; >int main() < double f = 1.203; printf("%f\n", f); char s[100]; printf("%s\n", fz(f, s)); printf("%s %s %s %s\n", fz(2.0, s), fz(0.0, s + 20), fz(421.1234, s + 40), fz(5.12909, s + 60)); return puts("End") == EOF; >===== result ===== 1.203000 1.203 2. 0. 421.1234 5.12909 End avp@avp-xubu2:~/hashcode$
Отслеживать
ответ дан 16 окт 2019 в 20:11
45.8k 6 6 золотых знаков 45 45 серебряных знаков 115 115 бронзовых знаков
- c
- вывод
- double
- printf
- обработка-данных
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Вывести число с плавающей точкой без лишних нулей
Уважаемые, форумчане! Столкнулась с такой проблемой. Необходимо вывести число с плавающей точкой без лишних нулей. Знаю, что есть формат %g, %G, но они не совсем походят. Т. к. он позволяет вывести лишь 6 значащих цифр, в то время как. иногда требуется выводить числа с точностью до 6ого знака включительно.
В общем число 3.123450 выведется нормально(3.12345), а 3.123456 выведется (3.12345) не так как нужно. (3.123456)
%f знаю, что можно задавать точность. Но заведомо неизвестно сколько значащих цифр после запятой в выводимом числе.
Можно ли как-то узнать кол-во значащих цифр после запятой? Или как-то указать свою максимальную точность и использовать %g?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Целое число вывести, как число с плавающей точкой
Вот код. Нужно вывести значение переменной х не более чем 5 символами. Т.е. надо округлить его до.
Как корректно вывести число с плавающей точкой
Доброго времени суток всем )) вот столкнулся с вирусом ) ну я его так назвал, когда идет.
Вывести число с плавающей точкой в разных представлениях
Изучаю язык(начал изучать с Си), всё очень нравится, вот только понимаю, что без помощи не обойтись.

Дано число с плавающей точкой — вывести его, округлив до тысячных
что то не пойму что это значит, и как реализовать
Как вывести float без лишних нулей
Здравствуйте!
Собственно, вопрос из названия темы. Попробовал создать маленькую программку в C++ (Windows Forms). Мне необходимо выводить на textBox вещественное число аж с 27 символами после запятой. Но иногда дробная часть не такая длинная, и выводятся лишние нули, иногда вообще число получается без дробной части.
Например, выводит 0,000453434500000000000000000, а нужно чтобы выводило 0,0004534345
Приведу лишь часть кода, убрав всякие вычисления, т.к. не в них суть темы:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) < Single a,c,val1,val2; long double result; //Это проверка, введено число или нет bool X = Single::TryParse(textBox1->Text, System::Globalization::NumberStyles::Number, System::Globalization::NumberFormatInfo::CurrentInfo, a); if (X == true) < // //Тут вычисления, в итоге выводим result // >textBox2->Text = String::Format("", result); >
Последний раз редактировалось Ghost3; 16.08.2013 в 20:31 .
Регистрация: 04.10.2008
Сообщений: 2,618
| Ps: если кому интересно тут уроки по WIndows forms C++/C# |
непойму, как можно рекламировать уроки и одновременно задавать такой вопрос. Если такой вопрос возник — уроки говно.
| 0,000453434500000000000000000, а нужно чтобы выводило 0,0004534345 |
я вобще не пойму чего ты хочешь, в double разрядов дох*ера и больше, ты хочешь чтобы их было меньше?
и это ты видишь 0,000453434500000000000000000, а на самом деле там 0,000453434500000000000000000. 004 231534 какое-нибудь.
| Мне необходимо выводить на textBox вещественное число аж с 27 символами после запятой. |
смотри в сторону sprintf или std::setprecision (из iomanip), но ты получишь строку, в которой будет нужное тебе количество разрядов, ну никак не «убрать лишние нули в вещественном типе»
Последний раз редактировалось rrrFer; 16.08.2013 в 14:11 .
Ученик в c++
Форумчанин
Регистрация: 28.02.2011
Сообщений: 162
Сообщение от rrrFer
непойму, как можно рекламировать уроки и одновременно задавать такой вопрос. Если такой вопрос возник — уроки говно.
В этих уроках не описывается этот вопрос, ибо он вовсе не относится к тем урокам.
Сообщение от rrrFer
я вобще не пойму чего ты хочешь, в double разрядов дох*ера и больше, ты хочешь чтобы их было меньше?
и это ты видишь 0,000453434500000000000000000, а на самом деле там 0,000453434500000000000000000. 004 231534 какое-нибудь.
Ну е-мае. Ответ-то выводит, приглядись, textBox2->Text = String::Format(«<0:F27>«, result);
0:F27>
С WindowsForms работаю впервые, потому и спрашиваю. Будь это простой код, я бы, к примеру, перевел бы вещественный тип в строку и с конца отсекал бы лишние нули. Правда т.к. я, повторюсь, впервые работаю с WindowsForms, не знаю как реализовать подобное. А возможно есть какие-то другие способы?
Ученик в c++
Форумчанин
Регистрация: 28.02.2011
Сообщений: 162
Ладно, догадался в тех случаях, когда в дробной части ничего нету, ничего не выводить ее (как всегда ступил )
textBox2->Text = String::Format("",result);
А вот в случае когда есть дробная часть с лишними нулями, я не знаю как поступить.
Пробовал что-то типо:
1.Переводим результат в строку.
2.Считаем с конца нули до тех пор, пока не наткнемся на иной символ (типо if(str[i]!=’0′) break
3. Выводим результат с обрезанной дробной частью, например
textBox2->Text = String::Format("<0:(тут надо как-то из F27 вычесть переменную, допустим, i )>",result);
Фигня какая-то =\
Регистрация: 04.10.2008
Сообщений: 2,618
| В этих уроках не описывается этот вопрос, ибо он вовсе не относится к тем урокам. |
нахрена давать в этой теме ссылку на уроки, которые «вовсе не относится» к теме?
| Ну е-мае. Ответ-то выводит, приглядись, textBox2->Text = String::Format(«», result); |
Тему нормально назвать потрудись.
| Пробовал что-то типо: 1.Переводим результат в строку. 2.Считаем с конца нули до тех пор, пока не наткнемся на иной символ (типо if(str[i]!=’0′) break 3. Выводим результат с обрезанной дробной частью, например |
я не вижу где ты это пробовал.
| Будь это простой код, я бы, к примеру, перевел бы вещественный тип в строку и с конца отсекал бы лишние нули. Правда т.к. я, повторюсь, впервые работаю с WindowsForms, не знаю как реализовать подобное. |
а это какойто-то особенный (не простой) код?
виндоформз — фрамеворк, не более. Он не запрещает использовать стандартную библиотеку.
str = str.substr(0, str.find_last_not_of('0'));
как то так убираются лишние нули (не проверял) — это второй и третий пункт твоего плана из 4 поста. Первый (перевести число в строку) поди сам сделаешь (или нагуглишь)
Ученик в c++
Форумчанин
Регистрация: 28.02.2011
Сообщений: 162
Если что-то не нравится — я не заставляю вас отвечать в этой теме.
Сообщение от rrrFer
нахрена давать в этой теме ссылку на уроки, которые «вовсе не относится» к теме?
«уроки по WIndows forms», прочитай повнимательнее. Не по самому c++.
Сообщение от rrrFer
Тему нормально назвать потрудись.
Название темы = мой вопрос. Какие претензии?
Сообщение от rrrFer
я не вижу где ты это пробовал.
Смысл выкладывать абсолютно не рабочий код?
Сообщение от rrrFer
а это какойто-то особенный (не простой) код?
Для меня как новичку — все языки не простые. Еще раз прочитайте — С «WindowsForms работаю впервые».
Сообщение от rrrFer
str = str.substr(0, str.find_last_not_of('0'));
как то так убираются лишние нули (не проверял) — это второй и третий пункт твоего плана из 4 поста.
Ну хоть что-то. Пойду у гугла спрашивать как код из «как-то так» превратить в «конкретно так» под мой случай
после:
Когда использую
str = str.substr(0, str.find_last_not_of('0'));
Возникает проблема:
error C2664: void System::Windows::Forms::Control::Text::set(System::String ^): невозможно преобразовать параметр 1 из "std::string" в "System::String ^"
Если вместо string str; сделать String ^ str;, то работать не будет. Зато преобразовывать из «std::string» в «System::String ^» не надо.
Последний раз редактировалось Ghost3; 16.08.2013 в 17:34 .
Регистрация: 04.10.2008
Сообщений: 2,618
| «уроки по WIndows forms», прочитай повнимательнее. Не по самому c++. |
Читай внимательно сам, я задал конкретный вопрос «зачем вставлять ссылку, которая не относится к теме?» — задаю уже третий или четвертый раз. Ты же сам писал «В этих уроках не описывается этот вопрос, ибо он вовсе не относится к тем урокам.». Мне кажется это реклама каких-то паршивых уроков.
| Смысл выкладывать абсолютно не рабочий код? |
Чтобы развеять наши сомнения, мы подозреваем что кода (и попыток, соответственно) небыло. Ты нарисовал 3 пункта, укажи какие именно не получаются и приведи к каждому из них свои попытки.
| Когда использую . Возникает проблема: |
Я использую, у меня ниче не возникает. наверное я неправильно использую?
Почему ты предлагаешь форумчанам каждый раз угадывать где ты накосячил? — почему не приводишь код?
#include #include int main()
| 0.123000000100000 0.1230000001 |
Проверил, работает. Была опечатка (я предупреждал что не проверял) — исправлялась добавлением «+1»
Последний раз редактировалось rrrFer; 16.08.2013 в 18:06 .
Ученик в c++
Форумчанин
Регистрация: 28.02.2011
Сообщений: 162
Сообщение от rrrFer
Почему ты предлагаешь форумчанам каждый раз угадывать где ты накосячил? — почему не приводишь код?
Потому что если бы я просил ИСПРАВИТЬ ОШИБКИ В МОЕМ КОДЕ, я бы сразу выложил. Я же спрашиваю про способы избавления от лишних нулей. А развел тут пустой треп о несчастной ссылке. Хорошо, я удалю ее.
Вот код, хотя из него ничего нового не узнаешь.
#pragma once #include #include . using namespace std; private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) < Single a,c,val1,val2,result; string str; //Это проверка, введено число или нет bool X = Single::TryParse(textBox1->Text, System::Globalization::NumberStyles::Number, System::Globalization::NumberFormatInfo::CurrentInfo, a); if (X == true) < // //Тут вычисления, в итоге выводим result // >//пока не сделал перевод из float в string str = "0.123000000100000"; str = str.substr(0, str.find_last_not_of('0')); textBox2->Text = str; >
| error C2664: void System::Windows::Forms::Control::Te xt::set(System::String ^): невозможно преобразовать параметр 1 из «std::string» в «System::String ^» |
Последний раз редактировалось Ghost3; 16.08.2013 в 21:46 .
Регистрация: 04.10.2008
Сообщений: 2,618
Вопрос надо задавать нормально. Правильно заданный вопрос — половина ответа (из чьей-то подписи). Впихивание всяких левых ссылок, несоответствие заголовка и содержания конкретности не добавляют.
Я посмотрел твой код и ниче не понял.
| error C2664: void System::Windows::Forms::Control::Te xt::set(System::String ^): невозможно преобразовать параметр 1 из «std::string» в «System::String ^» |
в какой строке ты словил эту ошибку? — я не нашел ниодного места где используется str (у тебя только одна переменная типа std::string в этом фрагменте).
Суть ошибки в том, что ты куда-то пихаешь std::string где ожидается String^.
Наверняка вместо String^ можно пихнуть const char* (оно неявно преобразуется в String^).
Для этого вместо использования str пиши str.c_str();
И код, когда ты его постишь, должен соответствовать ошибкам, которые ты описываешь. К ошибкам приводи номера строк. Иначе ты ответа не дождешься. Ответ нужен тебе или мне? — значит ты должен быть более заинтересован и оформлять все по-человечески.
Убрать лишние нули в параметре «количество товара»
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Войти
Уже зарегистрированы? Войдите здесь.
Больше способов поделиться.
Похожие публикации
Подсчет количества товаров в Order Info
Автор: Ch0oJoy, 11 октября
Минимальное количество для заказа в опциях
Автор: Kreaman, В четверг в 18:23
Сортировка массива по значению параметра
Автор: Mat, 16 августа
[Решено] Общее количество товара как сумма товаров в опциях
Автор: Maks, 28 марта 2012
Как убрать ошибку с модуля СallBack?
Автор: gavrilenkoandre92, 23 октября
Сейчас на странице 0 пользователей
- Нет пользователей, просматривающих эту страницу.
Покупателям
- Оплата дополнений физическими лицами
- Оплата дополнений юридическими лицами
- Политика возвратов
Разработчикам
- Регламент размещения дополнений
- Регламент продаж и поддержки дополнений
- Виртуальный аккаунт автора
- Политика продвижения объявлений
- API каталога дополнений
- Урегулирование споров по авторским правам
Полезная информация
- Публичная оферта
- Политика возвратов
- Политика конфиденциальности
- Платежная политика
- Политика Передачи Персональных Данных
- Политика прозрачности
Последние дополнения
![]()
![]()
![]()
![]()
![]()
Движок интернет магазина OpenCart (ocStore) — официальный сайт OpenCartForum.com Powered by Invision Community
- Уже зарегистрированы? Войти
- Регистрация
Раздел покупок
ocStore
- Назад
- Официальный сайт
- Демо ocStore 3.0.3.2
- Демо ocStore 2.3.0.2.4
- Скачать ocStore
- Документация
- История версий ocStore
Шаблоны
OpenCart.Pro
- Создать.
Важная информация
На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.