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.
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;
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).
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.
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;
}
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;
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);
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ą.
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
.
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ą.
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.
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);
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;
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;
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