Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2013, 13:34   #1
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию C++ Как убрать лишние нули в вещественном типе?

Здравствуйте!
Собственно, вопрос из названия темы. Попробовал создать маленькую программку в 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("{0:F27}", result);
}

Последний раз редактировалось Ghost3; 16.08.2013 в 20:31.
Ghost3 вне форума Ответить с цитированием
Старый 16.08.2013, 14:08   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 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.
rrrFer вне форума Ответить с цитированием
Старый 16.08.2013, 14:20   #3
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
непойму, как можно рекламировать уроки и одновременно задавать такой вопрос. Если такой вопрос возник - уроки говно.
В этих уроках не описывается этот вопрос, ибо он вовсе не относится к тем урокам.

Цитата:
Сообщение от rrrFer Посмотреть сообщение
я вобще не пойму чего ты хочешь, в double разрядов дох*ера и больше, ты хочешь чтобы их было меньше?
и это ты видишь 0,000453434500000000000000000, а на самом деле там 0,000453434500000000000000000...004 231534 какое-нибудь.
Ну е-мае. Ответ-то выводит, приглядись, textBox2->Text = String::Format("{0:F27}", result);

С WindowsForms работаю впервые, потому и спрашиваю. Будь это простой код, я бы, к примеру, перевел бы вещественный тип в строку и с конца отсекал бы лишние нули. Правда т.к. я, повторюсь, впервые работаю с WindowsForms, не знаю как реализовать подобное. А возможно есть какие-то другие способы?
Ghost3 вне форума Ответить с цитированием
Старый 16.08.2013, 16:13   #4
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Ладно, догадался в тех случаях, когда в дробной части ничего нету, ничего не выводить ее (как всегда ступил )
Код:
textBox2->Text = String::Format("{0:0}",result);
А вот в случае когда есть дробная часть с лишними нулями, я не знаю как поступить.

Пробовал что-то типо:
1.Переводим результат в строку.
2.Считаем с конца нули до тех пор, пока не наткнемся на иной символ (типо if(str[i]!='0') break
3. Выводим результат с обрезанной дробной частью, например
Код:
textBox2->Text = String::Format("{0:(тут надо как-то из F27 вычесть переменную, допустим, i )}",result);
Фигня какая-то =\
Ghost3 вне форума Ответить с цитированием
Старый 16.08.2013, 16:52   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
В этих уроках не описывается этот вопрос, ибо он вовсе не относится к тем урокам.
нахрена давать в этой теме ссылку на уроки, которые "вовсе не относится" к теме?
Цитата:
Ну е-мае. Ответ-то выводит, приглядись, textBox2->Text = String::Format("{0:F27}", result);
Тему нормально назвать потрудись.
Цитата:
Пробовал что-то типо:
1.Переводим результат в строку.
2.Считаем с конца нули до тех пор, пока не наткнемся на иной символ (типо if(str[i]!='0') break
3. Выводим результат с обрезанной дробной частью, например
я не вижу где ты это пробовал.
Цитата:
Будь это простой код, я бы, к примеру, перевел бы вещественный тип в строку и с конца отсекал бы лишние нули. Правда т.к. я, повторюсь, впервые работаю с WindowsForms, не знаю как реализовать подобное.
а это какойто-то особенный (не простой) код?
виндоформз - фрамеворк, не более. Он не запрещает использовать стандартную библиотеку.
Код:
str = str.substr(0, str.find_last_not_of('0'));
как то так убираются лишние нули (не проверял) - это второй и третий пункт твоего плана из 4 поста. Первый (перевести число в строку) поди сам сделаешь (или нагуглишь)
rrrFer вне форума Ответить с цитированием
Старый 16.08.2013, 17:15   #6
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 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.
Ghost3 вне форума Ответить с цитированием
Старый 16.08.2013, 18:02   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
"уроки по WIndows forms", прочитай повнимательнее. Не по самому c++.
Читай внимательно сам, я задал конкретный вопрос "зачем вставлять ссылку, которая не относится к теме?" - задаю уже третий или четвертый раз. Ты же сам писал "В этих уроках не описывается этот вопрос, ибо он вовсе не относится к тем урокам.". Мне кажется это реклама каких-то паршивых уроков.
Цитата:
Смысл выкладывать абсолютно не рабочий код?
Чтобы развеять наши сомнения, мы подозреваем что кода (и попыток, соответственно) небыло. Ты нарисовал 3 пункта, укажи какие именно не получаются и приведи к каждому из них свои попытки.
Цитата:
Когда использую ... Возникает проблема:
Я использую, у меня ниче не возникает. наверное я неправильно использую?

Почему ты предлагаешь форумчанам каждый раз угадывать где ты накосячил? - почему не приводишь код?

Код:
#include <string>
#include <iostream>

int main() {
  std::string str = "0.123000000100000";

  std::cout << str << std::endl << str.substr(0, str.find_last_not_of('0') + 1);
}
Цитата:
0.123000000100000
0.1230000001
Проверил, работает. Была опечатка (я предупреждал что не проверял) - исправлялась добавлением "+1"

Последний раз редактировалось rrrFer; 16.08.2013 в 18:06.
rrrFer вне форума Ответить с цитированием
Старый 16.08.2013, 20:30   #8
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Почему ты предлагаешь форумчанам каждый раз угадывать где ты накосячил? - почему не приводишь код?
Потому что если бы я просил ИСПРАВИТЬ ОШИБКИ В МОЕМ КОДЕ, я бы сразу выложил. Я же спрашиваю про способы избавления от лишних нулей. А развел тут пустой треп о несчастной ссылке. Хорошо, я удалю ее.

Вот код, хотя из него ничего нового не узнаешь.
Код:
#pragma once
#include <cmath>
#include <string>

...

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.
Ghost3 вне форума Ответить с цитированием
Старый 16.08.2013, 20:50   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 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();

И код, когда ты его постишь, должен соответствовать ошибкам, которые ты описываешь. К ошибкам приводи номера строк. Иначе ты ответа не дождешься. Ответ нужен тебе или мне? - значит ты должен быть более заинтересован и оформлять все по-человечески.
rrrFer вне форума Ответить с цитированием
Старый 16.08.2013, 21:46   #10
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Вопрос надо задавать нормально. Правильно заданный вопрос - половина ответа (из чьей-то подписи). Впихивание всяких левых ссылок, несоответствие заголовка и содержания конкретности не добавляют.
Впихивание ссылок - не влияют на "понятность" вопроса.
Несоответствие заголовка и содержание? Все соответствует, мне нужно было удалить из строки в ответе программы лишние нули после запятой. Что еще неясно и непонятно?

Цитата:
Сообщение от rrrFer Посмотреть сообщение
в какой строке ты словил эту ошибку? - я не нашел ниодного места где используется str (у тебя только одна переменная типа std::string в этом фрагменте).
Вот тут признаю свою ошибку - запостил одну строчку кода неверно. Вот тут ошибка выходит:
Код:
textBox2->Text = str;
Цитата:
Сообщение от rrrFer Посмотреть сообщение
Суть ошибки в том, что ты куда-то пихаешь std::string где ожидается String^.
Наверняка вместо String^ можно пихнуть const char* (оно неявно преобразуется в String^).
Для этого вместо использования str пиши str.c_str();
Спасибо, надо будет попробовать.



Все же если вдруг ты до сих пор не понял вопроса, то вот тебе самый разжеванный вариант:

Вот в этом коде:
Код:
#pragma once
#include <cmath>
#include <string>

...

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;
}
в самом внизу выводится текст, СТРОКА, если ты не знаешь, в String ^ а не обычный string.

Код:
textBox2->Text = str;
Мне надо чтобы справа налево удалялись лишние знаки нулей. Например, было 0,0003423423400000000, а надо чтобы стало 0,00034234234

Но проблема в том, что str - это обычный string, потому выводит ошибку.

Цитата:
error C2664: void System::Windows::Forms::Control::Te xt::set(System::String ^): невозможно преобразовать параметр 1 из "std::string" в "System::String ^"

Наверное так надо было тему оформить? Если нет - то еще более явно я не могу.

Просто раз взялся отвечать - надо не придираться к "ссылочкам". Если бы я задал вопрос: "как в c++ возводить в степень числа?" то я надеялся бы получить первым ответом пример:
Код:
#include <cmath>

int main()
{
    int a,b,x;
    x=pow(a,b);
}

Последний раз редактировалось Ghost3; 16.08.2013 в 21:58.
Ghost3 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать нули после запятой MishkaSh Помощь студентам 1 05.04.2013 07:16
как убрать лишние пробелы в меню Vervolf JavaScript, Ajax 6 07.05.2012 00:34
Как убрать нули??? Егор&Co Microsoft Office Excel 9 24.02.2011 12:39
как записывать в файл тип риал чтоб после точки эти нули убрать?? ТРОЯН=) Помощь студентам 3 24.04.2009 14:09
Убрать нули!!!) artemavd Общие вопросы Delphi 13 29.07.2008 09:10