Zatímco použití neprůhlednost do formuláře, měli bychom použít desetinnou čárku nebo dvojitou hodnotu?

hlasů
557

Chci použít skladbu bar změnit neprůhlednost formuláři je.

To je můj kód:

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

Když jsem se vytvořit aplikaci, dává následující chybu:

Nelze implicitně převést typ 'decimal'na 'double'.

Snažil jsem se pomocí transa double, ale pak ovladač nefunguje. Tento kód fungovalo v minulém VB.NET projekt.

Položena 31/07/2008 v 22:42
zdroj uživatelem
V jiných jazycích...                            


13 odpovědí

hlasů
395

Explicitní cast zdvojnásobit takhle není nutné:

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

Identifikace konstantní jako 5000.0(nebo 5000d) je dostatečný:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Odpovězeno 31/07/2008 v 23:17
zdroj uživatelem

hlasů
114

Obecnější odpověď na otázku „generické Decimal vs Double?“: Decimal pro měnové výpočty zachovat přesnost, dvojité pro vědecké výpočty, které nedostávají postižených malé rozdíly. Vzhledem k tomu, Double je typ, který je nativní CPU (vnitřní reprezentace je uložen v základně 2 ), výpočty s dvojitými provádět lepší než decimální (která je znázorněna na základu 10 interně).

Odpovězeno 01/08/2008 v 15:23
zdroj uživatelem

hlasů
75

Váš kód fungovalo dobře v VB.NET, protože implicitně nemá žádné odlitky, zatímco C # má jak implicitní a explicitní ty.

V C # převod z desítkové zdvojnásobit je explicitní, jak ke ztrátě přesnosti. Například 1.1 nemůže být přesně vyjádřeny jako dvojitý, ale může jako desetinné číslo (viz „ čísla s plovoucí desetinnou čárkou - více nepřesné, než si myslíte, “ z toho důvodu, proč).

Ve VB byla přidána konverze pro vás překladač:

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

Které (double)musí být výslovně uvedeno v jazyce C #, ale může být implicitně tím VB více ‚odpuštění‘ kompilátoru.

Odpovězeno 10/08/2008 v 18:54
zdroj uživatelem

hlasů
74

Proč se vydělí 5000? Stačí nastavit TrackBar je minimální a maximální hodnoty mezi 0 a 100 a pak rozdělit hodnotu o 100 pro procenta neprůhlednosti. pod minimální 20 příklad zabraňuje podobu z stává zcela neviditelná:

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;
}
Odpovězeno 21/09/2008 v 04:51
zdroj uživatelem

hlasů
57

Máte dva problémy. Za prvé, Opacityvyžaduje dvojí, nikoli desítkovou hodnotu. Překladač se ti, že i když tam je konverze mezi desetinné čárky a dvakrát se jedná o explicitní konverze, které je třeba zadat, aby pro to, aby práce. Druhým důvodem je, že TrackBar.Valueje celočíselná hodnota a vydělením int pomocí int výsledky v int bez ohledu na to, jaký typ proměnné ji přiřadit. V tomto případě je implicitní cast z int do desítkové nebo double - protože nedochází ke ztrátě přesnosti, když děláte obsazení - tak kompilátor nestěžuje, ale hodnota, kterou dostanete, je vždy 0, pravděpodobně, protože trackBar.Valueje vždy méně než 5000. řešení je změnit kód k použití dvojité (nativní typ pro Krytí) a že plovoucí řádovou čárkou výslovným dělat konstanta dvojitý -, která bude mít za následek, že podporuje aritmetické - nebo odlévání trackBar.Valuezdvojnásobit, což udělá totéž - nebo obojí. Jo, a vy nepotřebujete zprostředkující proměnnou, pokud použít jinde. Můj odhad je, že kompilátor bude optimalizovat to pryč, tak jako tak.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Odpovězeno 27/02/2009 v 12:45
zdroj uživatelem

hlasů
55

Podle mého názoru, je žádoucí, aby bylo tak jednoznačné, jak je to možné. To zvyšuje přehlednost kódu a pomáhá své kolegy programátory, kteří mohou ji nakonec číst.

Kromě (nebo místo), připojením .0na číslo, můžete použít decimal.ToDouble().

Zde jsou nějaké příklady:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Odpovězeno 05/08/2008 v 21:18
zdroj uživatelem

hlasů
53

Vypadá to, že this.Opacityje dvojí hodnotu, a kompilátor nemá rád snažíte vtěsnat hodnotu desítkové do něj.

Odpovězeno 01/08/2008 v 14:53
zdroj uživatelem

hlasů
45

Měli byste použít 5000.0namísto 5000.

Odpovězeno 20/11/2008 v 15:36
zdroj uživatelem

hlasů
44

Krytí vlastnost je dvojího druhu:

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

nebo prostě:

this.Opacity = trackBar1.Value / 5000.0;

nebo:

this.Opacity = trackBar1.Value / 5000d;

Všimněte si, že jsem pomocí 5000.0(nebo 5000d) vynutit dvojí rozdělení, protože trackBar1.Valueje celé číslo, a to by provést celočíselné dělení a výsledkem bude celé číslo.

Odpovězeno 31/08/2011 v 20:08
zdroj uživatelem

hlasů
42

Za předpokladu, že používáte WinForms, Form.Opacityje typu double, takže byste měli použít:

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

Pokud je třeba hodnotu jinde, je to jednodušší napsat:

this.Opacity = trackBar1.Value / 5000.0;

Důvodem, proč ovladač nefunguje, když jste změnili kód jednoduše double bylo proto, že jste měli:

double trans = trackbar1.Value / 5000;

které interpretovat 5000jako celé číslo, takže transhodnota byla vždy nulové. Explicitně dělat číselné plovoucí bodovou hodnotu přidáním .0kompilátor nyní může interpretovat jako dvojitá a provádět správné výpočty.

Odpovězeno 31/08/2011 v 20:09
zdroj uživatelem

hlasů
38

Nejlepším řešením je:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Odpovězeno 06/03/2012 v 09:07
zdroj uživatelem

hlasů
37

Vzhledem k tomu, Opacityje dvojí hodnotu, tak bych prostě použít double od samého počátku a nevrhá vůbec, ale je nutné použít dvojité při dělení, takže neztrácíte žádnou přesnost

Opacity = trackBar1.Value / 5000.0;
Odpovězeno 13/05/2012 v 03:10
zdroj uživatelem

hlasů
31
this.Opacity = trackBar1.Value / 5000d;
Odpovězeno 11/04/2013 v 16:08
zdroj uživatelem

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