Konwertować dziesiętne na podwójne?

Chcę użyć track-bar, aby zmienić krycie formularza.

To jest mój kod:

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

Kiedy buduję aplikację, wyświetla się następujący błąd:

Nie można w domyśle przekształcić typu 'decimal' na 'double'.

Próbowałem użyć trans i double, ale wtedy Kontrola nie działa. Ten kod działał dobrze w przeszłości VB.NET projekt.

Author: Eggs McLaren, 2008-08-01

13 answers

Wyraźna Obsada, aby podwoić jak to nie jest konieczne:

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

Identyfikacja stałej jako 5000.0 (lub jako 5000d) jest wystarczająca:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
 401
Author: Kevin Dente,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 05:06:57

Bardziej ogólna odpowiedź na ogólne Pytanie " Decimal vs Double?": dziesiętne dla obliczeń monetarnych w celu zachowania precyzji, Podwójne dla obliczeń naukowych, na które nie mają wpływu niewielkie różnice. Ponieważ Double jest typem, który jest natywny dla procesora (wewnętrzna reprezentacja jest przechowywana w Baza 2), obliczenia wykonane z Double działają lepiej niż dziesiętne (które jest reprezentowane w baza 10 wewnętrznie).

 117
Author: huseyint,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 14:42:28

Twój kod działał dobrze w VB.NET ponieważ w sposób niejawny wykonuje dowolne rzuty, podczas gdy C# ma zarówno implicit, jak i explicit.

W C# konwersja z dziesiętnego na podwójny jest jawna, gdy tracisz dokładność. Na przykład 1.1 nie może być dokładnie wyrażone jako podwójne, ale może jako dziesiętne (zobacz " liczby zmiennoprzecinkowe - bardziej niedokładne niż myślisz " z tego powodu).

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

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

To (double) musi być w C#, ale może być implikowane przez bardziej "wybaczający" kompilator VB.

 76
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 11:51:08

Dlaczego dzielisz przez 5000? Po prostu ustaw minimalne i maksymalne wartości paska ścieżek między 0 a 100, a następnie podziel wartość przez 100 dla procentu krycia. Poniższy przykład minimum 20 uniemożliwia całkowicie niewidoczną postać:

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;
}
 74
Author: Gordon Bell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-01 12:51:15

Masz dwa problemy. Po pierwsze, Opacity wymaga podwójnej, a nie dziesiętnej wartości. Kompilator mówi ci, że chociaż istnieje konwersja między dziesiętnym i podwójnym, jest to jawna konwersja, którą musisz określić, aby działała. Druga jest taka, że TrackBar.Value jest wartością całkowitą i dzielenie int przez int powoduje int bez względu na to, jaki typ zmiennej przypisujesz go do. W tym przypadku istnieje rzut implicite z Int do decimal lub double-ponieważ nie ma utraty precision when you do the cast-so the compiler doesn ' t scarage, but the value you get is always 0, przypuszczalnie, ponieważ trackBar.Value is always less than 5000. Rozwiązaniem jest zmiana kodu na double (natywny Typ nieprzezroczystości) i arytmetyka zmiennoprzecinkowa poprzez jawne uczynienie stałej podwójną - co będzie miało wpływ na promowanie arytmetyki-lub przekształcenie trackBar.Value w double, co zrobi to samo-lub jedno i drugie. I nie potrzebujesz zmiennej pośredniej, chyba że używany gdzie indziej. Domyślam się, że kompilator i tak by to zoptymalizował.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
 57
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 16:40:13

Moim zdaniem, pożądane jest, aby być jak najbardziej jednoznacznym. Zwiększa to przejrzystość kodu i pomaga innym programistom, którzy mogą go w końcu przeczytać.

Oprócz (lub zamiast) dodawania .0 do 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);
 55
Author: andnil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 11:52:15

Wygląda na to, że this.Opacity jest wartością podwójną, a kompilator nie lubi, gdy próbujesz wcisnąć do niej wartość dziesiętną.

 54
Author: Ryan Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 11:54:40

Należy użyć 5000.0 zamiast 5000.

 45
Author: Dinah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 11:54:23

Właściwość nieprzezroczystość jest typu podwójnego:

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

Lub po prostu:

this.Opacity = trackBar1.Value / 5000.0;

Lub:

this.Opacity = trackBar1.Value / 5000d;

Zauważ, że używam 5000.0 (lub 5000d), Aby wymusić podwójny podział, ponieważ trackBar1.Value jest liczbą całkowitą i wykona podział liczby całkowitej, a wynik będzie liczbą całkowitą.

 44
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 19:08:26

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

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

Jeśli nie potrzebujesz wartości gdzie indziej, łatwiej jest napisać:

this.Opacity = trackBar1.Value / 5000.0;

Powodem, dla którego Kontrola nie działa, gdy zmieniłeś kod na po prostu podwójny, było to, że miałeś:

double trans = trackbar1.Value / 5000;

Który interpretował 5000 jako liczbę całkowitą, więc twoja trans wartość była zawsze zerowa. Jawnie czyniąc wartość zmiennoprzecinkową przez dodanie .0 kompilator może teraz interpretować to jako podwójne i wykonać odpowiednie obliczenia.

 42
Author: ChrisF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 16:19:19

Najlepszym rozwiązaniem jest:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
 38
Author: Danny Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 08:07:53

Ponieważ Opacity jest wartością podwójną, użyłbym po prostu podwójnego od początku i w ogóle nie rzucał, ale pamiętaj, aby użyć podwójnego podczas dzielenia, aby nie stracić żadnej precyzji

Opacity = trackBar1.Value / 5000.0;
 37
Author: Darryl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 11:55:08
this.Opacity = trackBar1.Value / 5000d;
 32
Author: AkoSi Asiong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-20 17:18:47