Liczba bez zaokrąglenia

0

Witam wszystkich forumowiczów.
Mam taki oto problem.
Są dwa textBoxy, dwa labele, i jeden button.
Do jednego textBoxa1 wpisuję liczbę rzeczywistą, i ma ona być automatycznie przemnożona przez 10.
Wynik ma być wyświetlony w drugim textBoxie jako liczba całkowita.
I niby wszystko jest ok, ale jest małe ale.
Otóż liczba w drugim textBoxie ma być nie zaokrąglona np.:
textBox1 - wpisuję 12,34
textBox6 - pokazuje 123 - i jest ok, ale jak wpisuję

textBox1 - wpisuje 12,35
textBox6 - pokazuje 124 - i tu mam problem - chcę aby było 123, bez zaokrąglenia w górę.

Chodzi mi o to, aby z liczb z textBoxa1, wynik w textBox6 przecinek przesuwał się o jedną pozycję, ale wynik był bez przecinka, a liczba nie zaokrąglona. Np.:
12 -> 120 - ok
12,3 -> 123 - ok
12,34 -> 123 - ok
12,35 -> 124 - błąd (ma być 123)

Mam tak: (textBox1 ma label1, a textBox6 ma label5)

double label1;
int dycha, label5;
dycha=10;

textBox6->Text = (Convert::ToInt16((label1)*dycha)).ToString();     //bez przecinka ale zaokrągla
 

drugi sposób

 textBox6->Text = Convert::ToString ((Convert::ToDouble(label1) * Convert::ToInt32( dycha)).ToString("F0"));   //bez przecinka ale zaokrągla

Mam nadzieję że w miarę dobrze opisałem problem.
Proszę o pomoc.
Z góry dziękuję i pozdrawiam.

0

po prostu zrzutuj na int.

((int) label1)*dycha

Edit:
| racja pomyłka (int)(label1*dycha)
V

0
rafal-prog napisał(a)

po prostu zrzutuj na int.

((int) label1)*dycha

Zrobiłem tak:

textBox6->Text = Convert::ToInt16(((int)label1)*dycha).ToString(); 

To po wpisaniu 12.35 wychodzi 120, czyli dalej nie tak.
A chcę aby było 123.

0

Bo najpierw trzeba pomnożyć, dopiero zrzutować.

0

Jak otrzymasz liczbe double 12,35 to zrob

static_cast<int>(x*10);

Daje 123

0
Krycho napisał(a)

Jak otrzymasz liczbe double 12,35 to zrob

static_cast<int>(x*10);

Daje 123

Nie próbowałem z rzutowaniem, od razu zrobiłem powyższe i działa.
Wielkie dzięki dla Was za pomoc.
Pozdrawiam.

0

Witam ponownie.
Sposób z rzutowaniem jest skuteczny, ale pojawił się następny problem.
W momencie kiedy naciskam button1 w textBoxie4 najpierw pojawia się zero, a dopiero ponowne naciśnięcie przycisku pokazuje prawidłową liczbę.
Czy jest jakiś sposób, aby wynik pokazywał się za pierwszym razem. Przegrzebałem trzy dni po forach, ale z tym problemem się nie spotkałem.
Chciałbym również, aby wynik był wyświetlany niekoniecznie przez naciśnięcie buttona, ale również poprzez naciśnięcie klawisza Enter.
Oto mój kod:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
			 {
				 double label1, label2, label3;
				 int sto, jeden, dycha, label4;
				 sto=100;
				 dycha=10;
				 jeden=1;

				 double::TryParse(textBox1->Text, label1);
				 double::TryParse(textBox2->Text, label2);
				 double::TryParse(textBox3->Text, label3);
				 int::TryParse(textBox4->Text, label4);

				 {
					 textBox4->Text = static_cast<int>((label1)*dycha).ToString();
				 };
				 {
					 textBox1->Text = Convert::ToString
						 ((((Convert::ToDouble(textBox3->Text)*(sto)+jeden)*
						 (sto-Convert::ToDouble(textBox2->Text)))/sto).ToString("F2"));
					 return;
				 };


			 } 

Myślałem że zabawa w C++ będzie szła pod łagodniejszą górkę, ale czasem są szczyty zbyt wysokie.
Pozdrawiam Paweł.

0

Do czego są Ci potrzebne te klamry?

 {
     textBox4->Text = static_cast<int>((label1)*dycha).ToString();
 };

Wyrzucenie wyniku poprzez wciśniecie enter, zrealizujesz poprzez Event KeyDown.

0

No fakt.
Kod trochę wyczyściłem, aby był czytelniejszy.
W oknie mam jeszcze trzy radioButtony, które w sprawie mojego problemu są niepotrzebne.
Przed tymi klamrami jest to:

 if (radioButton1->Checked || radioButton2->Checked || radioButton3->Checked)
				 {
					 textBox6->Text = static_cast<int>((label1)*dycha).ToString();
				 }; 

...itd.

0

Porownaj tutaj jest ok.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit_2->setEnabled(false);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnClick()));
    connect(ui->actionExit,SIGNAL(triggered()),qApp,SLOT(quit()));
    success=false;
}

void MainWindow::OnClick()
{
    text=ui->lineEdit->text();
    number=text.toDouble(&success);
    number+=0.01; // przy np. 12.2 daje 121 a przy 12.3 123 dla pewnosci dodaje 0.01 zeby bylo ok
    result = static_cast<int>(number*10);
    if(!success)ui->lineEdit_2->setText("Zle dane");
    else ui->lineEdit_2->setText(QString::number(result));
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Enter)this->OnClick();
}
0

Krycho
kilka postów wyżej mi podałeś:

static_cast<int>(x*10); 

i to działa, przecinek się przesuwa, liczba się nie zaokrągla, i o to chodziło.

Żeby wyświetlić ten wynik w textBoxie4, to po pierwszym kliknięciu pojawia się 0(zero), a prawidłowy wynik mam za drugim kliknięciem.
Na logikę wiem o co chodzi. Mam cztery textBoxy, dane potrzebne do tego czwartego textBoxa pobierane są raz z tB1, innym razem z tB2 lub tB3. Zmieniam to sobie radioButtonem.
Kiedy w textBoxie1 i textBoxie2 są już dane, jeden wynik końcowy mam w textBoxie3, a drugi wynik w textBoxie4, obliczane one są po pierwszym kliknięciu, ponieważ tB4 pobiera dane zawsze z tB1, a w tym przypadku w tB1 dane były bo je sam wpisałem.
Kiedy tB1 jest szukaną, to muszę dane wpisać wpierw do tB2 i i tB3. Wówczas po kliknięciu, w tB1 pojawia się prawidłowy wynik, a w tB4 pojawia się 0 (zero), ale jak kliknę drugi raz to już w tB4 mam to co chcę, ponieważ tB1 po pierwszym kliknięciu wyliczył szukaną.
Kombinowałem coś z refresh, ale jestem jeszcze cienki z programowania.

Co do drugiej prośby odpowiedzianej przez kopernika, to jaki kod mam wpisać w zdarzeniu KeyDown.

Trochę namieszałem, ale mam nadzieję wszystko jest w miarę jasne.

0

Jedyne co mi przychodzi do glowy bez kodu to ze zle wywolujesz funkcje. Za pierwszym kliknieciem wywoluje sie funkcja dla textboxa4 na podstawie blednych danych dlatego daje 0. Dopiero za drugim razem kiedy juz sie ustawia dane to bierze poprawne i wyswietla wynik.

0

W sumie to nie jest to taki aż problem. Po prostu dwa razy klik i po sprawie.
Ale przypomniał mi się jeszcze jeden problem. Nie będę zakładał nowego tematu bo może jest banalny.
Otóż mój program zaniosłem dzisiaj do pracy, jest tam wiele stanowisk.
Na swoim odpaliłem mój programik, no i super poszedł. Minęło ok pół godz, uruchamiam, a tu zwis i wyskoczył alert:
"Aplikacja nie została właściwie zainicjowana(0xc000007b),kliknij przycisk aby..."
Framework 4 jest zainstalowana, więc o co chodzi?
Dodam jeszcze że przy okazji program zwiększył swoją objętość o ok 50kB - dziwne.
Może ktoś już taki przypadek miał.
Ja używam Visual C++ 2010 Express.

0

Bardzo mozliwe, ze gdzies sa jakies niezainicjowane dane lub funkcja wywoluje sie dla niezainicjowanych zmiennych i zdarzy sie czasami wlasnie crash. Ciezko powiedziec dokladnie o co chodzi bez kodu, ale takie bledy wystepuja raczej kiedy aplikacja operuje na "nie swoim" obszarze pamieci, wtedy system to wylapuje.

0
papcio chmiel napisał(a)

Dodam jeszcze że przy okazji program zwiększył swoją objętość o ok 50kB - dziwne.
Doczepił się wirus? :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1