Stosując krycie do formularza, należy użyć po przecinku lub podwójną wartość?

głosy
557

Chcę użyć Track-bar zmienić krycie forma jest.

To jest mój kodu:

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

Kiedy zbudować aplikację, daje następujący błąd:

Nie można niejawnie przekonwertować typu 'decimal'do 'double'.

Próbowałem za pomocą transa doublejednak wówczas sterowania nie działa. Ten kod pracował dobrze w poprzednim projekcie VB.NET.

Utwórz 31/07/2008 o 22:42
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
395

Wyraźne obsada podwoić jak nie jest to konieczne:

double trans = (double) trackBar1.Value / 5000.0;

Identyfikujący stałe, jak 5000.0(lub 5000d) jest wystarczająca:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Odpowiedział 31/07/2008 o 23:17
źródło użytkownik

głosy
114

Bardziej odpowiedź rodzajowy dla generycznego zapytania „Decimal vs dwuosobowe?”: Dziesiętny dla obliczeń pieniężnej zachować precyzję, podwójne do obliczeń naukowych, które nie uzyskać dotkniętych małych różnic. Od podwójnego jest typu, który jest natywny dla procesora (przedstawienie wewnętrzny jest przechowywany w bazie 2 ) Obliczenia wykonane z podwójnymi przeprowadzania lepsza niż dziesiętny (co jest przedstawione na podstawie 10 wewnętrznie).

Odpowiedział 01/08/2008 o 15:23
źródło użytkownik

głosy
75

Twój kod pracował dobrze w VB.NET, ponieważ domyślnie ma żadnych rzutów, podczas gdy C # ma obie te niejawne i jawne.

W języku C # konwersji z przecinku do podwójnego jest jednoznaczne jak stracić dokładność. Dla przykładu 1.1 nie może być dokładnie wyrażona jako podwójne, ale może jako ułamek dziesiętny (patrz „ liczb zmiennoprzecinkowych - bardziej niedokładne, niż myślisz ” z tego powodu, dlaczego).

W VB konwersja została dodana do ciebie przez kompilator:

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

Że (double)musi być wyraźnie wskazane w C #, ale może być dorozumiany przez VB bardziej „wyrozumiały” kompilator.

Odpowiedział 10/08/2008 o 18:54
źródło użytkownik

głosy
74

Czemu podzielenie przez 5000? Wystarczy ustawić potencjometr na minimalne i maksymalne wartości od 0 do 100, a następnie podzielić przez 100. Wartości dla odsetka Krycie. Minimalna 20 Przykład poniżej zapobiega formę z coraz całkowicie niewidoczne:

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}
Odpowiedział 21/09/2008 o 04:51
źródło użytkownik

głosy
57

Masz dwa problemy. Po pierwsze, Opacitywymaga podwójnej, a nie wartość dziesiętną. Kompilator jest informacją, że podczas gdy nie jest konwersja między przecinku i podwójne, jest to jednoznaczne przekształcenie, które należy określić w celu użycia go do pracy. Drugim jest to, że TrackBar.Valuejest liczbą całkowitą, a następnie dzieląc przez int int skutkuje int bez względu na to, jaki typ zmiennej przypisać go do. W tym przypadku nie jest niejawna odlewane z int na dziesiętny lub podwójnie - bo nie ma utraty precyzji podczas wykonywania obsady - więc kompilator nie narzekam, ale wartość dostajesz jest zawsze 0, prawdopodobnie, ponieważ trackBar.Valuejest zawsze mniej niż 5000. rozwiązaniem jest zmienić swój kod do wykorzystania podwójne (natywny typ dla Opacity) i nie arytmetyki zmiennoprzecinkowej przez co wyraźnie stała podwójna - co będzie miało wpływ promowanie arytmetyki - lub rzucając trackBar.Valuesię podwoić, co zrobi to samo - albo jedno i drugie. Aha, i nie trzeba zmienną pośrednią, chyba że stosowane gdzie indziej. Domyślam się, że kompilator by zoptymalizować go precz, i tak.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Odpowiedział 27/02/2009 o 12:45
źródło użytkownik

głosy
55

Moim zdaniem, pożądane jest, aby być tak wyraźne, jak to możliwe. To zwiększa przejrzystość kodu i wspomaga swoich kolegów programistów, którzy mogą w końcu ją przeczytać.

Oprócz (lub zamiast) dołączenie .0do liczby, można użyć decimal.ToDouble().

Oto kilka przykładów:

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Odpowiedział 05/08/2008 o 21:18
źródło użytkownik

głosy
53

To brzmi jak this.Opacityto podwójna wartość, a kompilator nie podoba Ci próbuje dopchać wartość dziesiętną do niego.

Odpowiedział 01/08/2008 o 14:53
źródło użytkownik

głosy
45

Należy użyć 5000.0zamiast 5000.

Odpowiedział 20/11/2008 o 15:36
źródło użytkownik

głosy
44

Krycie właściwość jest typu double:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

lub po prostu:

this.Opacity = trackBar1.Value / 5000.0;

lub:

this.Opacity = trackBar1.Value / 5000d;

Należy zauważyć, że ja za pomocą 5000.0(a 5000d), aby wymusić podwójne podziału, ponieważ trackBar1.Valuejest liczbą całkowitą, a to wykonać podział całkowitej a wynik będzie całkowita.

Odpowiedział 31/08/2011 o 20:08
źródło użytkownik

głosy
42

Zakładając, że używasz WinForms, Form.Opacityjest typu double, więc należy używać:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

Chyba trzeba wartość gdzie indziej, to prościej napisać:

this.Opacity = trackBar1.Value / 5000.0;

Powodem sterowania nie działa po zmianie kodu po prostu być podwójne dlatego trzeba było:

double trans = trackbar1.Value / 5000;

który zinterpretował 5000jako liczba całkowita, więc transwartość była zawsze zero. Przez co wyraźnie numeryczną wartość zmiennoprzecinkową poprzez dodanie .0kompilator może teraz interpretować go jako podwójne i przeprowadzenia prawidłowego obliczenia.

Odpowiedział 31/08/2011 o 20:09
źródło użytkownik

głosy
38

Najlepszym rozwiązaniem jest:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Odpowiedział 06/03/2012 o 09:07
źródło użytkownik

głosy
37

Ponieważ Opacityjest podwójna wartość, chciałbym po prostu użyć podwójnego od samego początku i nie rzucać w ogóle, ale należy użyć podwójnego przy podziale więc nie stracić żadnej precyzji

Opacity = trackBar1.Value / 5000.0;
Odpowiedział 13/05/2012 o 03:10
źródło użytkownik

głosy
31
this.Opacity = trackBar1.Value / 5000d;
Odpowiedział 11/04/2013 o 16:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more