WinForms C# .NET - Konwersja double na int, wynik działania liczbą całkowitą.

0

Witam, napotkałem być może problem prosty do rozwiązania, jednakże posiłkując się YT za nic nie chce mnie to wyjść.
Przeszukałem połowę forum również nie pasuje do żadnego.

Problem mój polega na tym, iż chciałbym aby wynik działania podany został jako liczba bez przecinków, zaokrąglona do pełnej liczby pięciocyfrowej np. 12020
mam do działania takie dane jak:

oee - która musi być liczbą z pojedynczą precyzją, zmiennoprzecinkowa np. 86,3 ( będą do procenty )
dla jasności OEE to tzw. współczynnik jakości - podawany w %.

target - to liczba max pięciocyfrowa, całkowita określająca ilość sztuk. np: 12020

cykl - 3,1

oraz

time - czas dostępny wykazany w sekundach, również liczba całkowita pięciocyfrowa np.:43200

Działanie wygląda tak:

lab_target.Text = ((int.Parse(tb_time.Text) / float.Parse(tb_cykl.Text) / 100) * oee).ToString();

lab_target.Text = 12026,3229506192 !!??

potrzebuję wyniku typu: 12026

help. nie wiem w jaki sposób miałbym te zmienne przedstawic oraz skonwertować aby otrzymać taki wynik.

2

całość na inta :P (int)12026.3229506192

zależy też jak chcesz zaokrąglenie robić

1
int wynikInt = (int)Math.Ceiling(wynik);
0
Kokoniłaj napisał(a):
int wynikInt = (int)Math.Ceiling(wynik);

Moje zmienne są stringami i nie mogę jawnie przekonwertować je na float ani też int. Mój string potrzebny to: lab_target.Text który wygląda tak: 12026.3229506192
Dodam że dane takie jak cykl - lab_cykl.Text będzie wpisywane przez użytkownika w TextBox;a. również czas dostępny, to dane nie statyczne.

0
double wynik = int.Parse(tb_time.Text) / float.Parse(tb_cykl.Text) / 100) * oee;
//zaokrąglenie w dół
lab_target.Text = Math.Floor(wynik);
//zaokrąglenie w górę
lab_target.Text = Math.Ceiling(wynik);
//rzutowanie do inta
lab_target.Text = ((int)wynik).ToString();
//użycie formatowania
lab_target.Text = wynik.ToString("0");
1

Zastanwiałeś się co będzie jak ktoś w twojego textboxa wpisze np. "aa" zamiast

int.Parse

polecam

int.TryParse

jeżeli nie masz żadnego zabezpieczania to inaczej Ci się program wysypie

przykład

            string tb_time = "43200";
            string tb_cykl = "3,1";
            string oee = "86,3";
            int.TryParse(tb_time, out int tb_time_num);
            float.TryParse(tb_cykl, out float tb_cykl_num);
            float.TryParse(oee, out float oee_num);
            string result = Math.Floor((tb_time_num / tb_cykl_num / 100) * oee_num).ToString();
           Console.WriteLine(result);
0

Chłopaki! przede wszystkim dzięki Wam wielkie za zaangażowanie i potraktowanie tematu poważnie.
Mam obecnie chwilę wolnego czasu , więc zabieram się do działania.
O wynikach z pewnością poinformuję jak tylko zastosuję rozwiązanie.

0

A więc tak..
Zastosowałem się do instrukcji, i działa ale..
Działa do momentu obcinki reszty po przecinku, jednak w dalszym ciągu nie można zaokrąglić liczby (w górę).
:(

0

Jakiej metody użyłeś? Jakiego zaokrąglenia potrzebujesz?

Są trzy podstawowe zaokrąglenia:
Do najbliższej wartości -> Math.Round
W górę -> Math.Ceiling
w dół -> Math.Floor

0
Wilktar napisał(a):

Jakiej metody użyłeś? Jakiego zaokrąglenia potrzebujesz?

Są trzy podstawowe zaokrąglenia:
Do najbliższej wartości -> Math.Round
W górę -> Math.Ceiling
w dół -> Math.Floor

Wykonałem zapis dokładnie tak jak podałeś wcześniej z zaokrągleniem w górę:

double wynik = ((int.Parse(tb_peeling.Text) - int.Parse(tb_sumaNG.Text)) / (int.Parse(tb_czasDostepny.Text) / double.Parse(tb_czasCyklu.Text)) * 100);
          lab_oee.Text = ((int)wynik).ToString();              /* RZUTOWANIE DO INT */
          lab_oee.Text = Math.Ceiling(wynik);                /* ZAOKRĄGLENIE W GÓRĘ */
          lab_oee.Text = wynik.ToString("0.00");

i za każdym razem czy zaokrąglam w górę czy też w dół wyrzuca mi komunikat o braku możliwość przekonwertowania "double" na "string"

0

A nie lepiej decimala ? Round chyba działa jak rzutowanie na int, a ceiling albo floor zawsze w jedną stronę.

decimal wynik = Convert.ToDecimal(((int.Parse(tb_peeling.Text) - int.Parse(tb_sumaNG.Text)) / (int.Parse(tb_czasDostepny.Text) / double.Parse(tb_czasCyklu.Text)) * 100));
          lab_oee.Text = Math.Round(wynik).ToString();
0

Nie potrzebnie użyłem skrótu myślowego i trochę na szybko dla tego wkradł się ten błąd.

Jeżeli zaokrąglenie do najbliższej liczby to:

double wynik = ((int.Parse(tb_peeling.Text) - int.Parse(tb_sumaNG.Text)) / (int.Parse(tb_czasDostepny.Text) / double.Parse(tb_czasCyklu.Text)) * 100);
lab_oee.Text = Math.Round(wynik).ToString();

Jeżeli zaokrąglenie w dół to:

double wynik = ((int.Parse(tb_peeling.Text) - int.Parse(tb_sumaNG.Text)) / (int.Parse(tb_czasDostepny.Text) / double.Parse(tb_czasCyklu.Text)) * 100);
lab_oee.Text = Math.Floor(wynik).ToString();

Jeżeli zaokrąglenie w górę to:

double wynik = ((int.Parse(tb_peeling.Text) - int.Parse(tb_sumaNG.Text)) / (int.Parse(tb_czasDostepny.Text) / double.Parse(tb_czasCyklu.Text)) * 100);
lab_oee.Text = Math.Ceiling(wynik).ToString();

Można też użyć dwóch alternatyw (zokrąglenie w dół):

double wynik = ((int.Parse(tb_peeling.Text) - int.Parse(tb_sumaNG.Text)) / (int.Parse(tb_czasDostepny.Text) / double.Parse(tb_czasCyklu.Text)) * 100);
lab_oee.Text = ((int)wynik).ToString();

lub (zaokrąglenie do najbliższej):

double wynik = ((int.Parse(tb_peeling.Text) - int.Parse(tb_sumaNG.Text)) / (int.Parse(tb_czasDostepny.Text) / double.Parse(tb_czasCyklu.Text)) * 100);
lab_oee.Text = wynik.ToString("0");

Może ten kawałek kodu rozjaśni to całkiem:

double wynik = 1.9;
Console.WriteLine("Math.Round: " + Math.Round(wynik).ToString());

Console.WriteLine("Math.Floor: " + Math.Floor(wynik).ToString());

Console.WriteLine("Math.Ceiling: " + Math.Ceiling(wynik).ToString());

Console.WriteLine("(int)wynik: " + ((int)wynik).ToString());

Console.WriteLine("ToString: " + wynik.ToString("0"));

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