Alkalmazása opacity egy űrlapot, használjunk egy tizedes vagy kettős érték?

szavazat
557

Szeretnék használni a pálya-bár változtatni formában átlátszóságát.

Ez a kód:

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

Amikor építeni az alkalmazást, ez ad a következő hiba:

Nem lehet implicit konverzióra típus 'decimal'a 'double'.

Próbáltam használ trans, és doubleaztán a vezérlő nem működik. Ez a kód működött a múltban VB.NET projekt.

A kérdést 31/07/2008 22:42
a forrás felhasználó
Más nyelveken...                            


13 válasz

szavazat
395

Az explicit leadott duplázni, mint ez nem szükséges:

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

Azonosítása az állandó, mint 5000.0(vagy 5000d) elegendő:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Válaszolt 31/07/2008 23:17
a forrás felhasználó

szavazat
53

Úgy hangzik, mint this.Opacityegy dupla értékét, valamint a fordító nem szeretném, ha próbál teletölteni egy tizedes értéket is.

Válaszolt 01/08/2008 14:53
a forrás felhasználó

szavazat
114

Egy általános válasz az általános kérdést: „Tizedes vs Double?”: Tizedes monetáris számítások megőrizni a pontosság, Double tudományos számítások, amelyek nem kap az érintett kis különbségek. Mivel Double egy olyan típusú, amely őshonos a CPU (belső reprezentáció tárolják bázis 2 ), számítások, dupla jobban teljesítenek majd decimális (amely képviselteti bázis 10 belsőleg).

Válaszolt 01/08/2008 15:23
a forrás felhasználó

szavazat
55

Véleményem kívánatos, hogy olyan egyértelmű, mint lehetséges. Ezt egészíti ki az egyértelműség a kódot, és segíti a többi programozók, akik esetleg elolvasni.

Amellett, hogy (vagy helyett) appending .0a számot, akkor használja decimal.ToDouble().

Íme néhány példa:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Válaszolt 05/08/2008 21:18
a forrás felhasználó

szavazat
75

A kód működött a VB.NET mert implicit módon minden vet, míg a C # egyaránt implicit és explicit is.

C # a konverzió tizedes kettős explicit, mivel csökken a pontosság. Például 1.1 nem lehet pontosan kifejezni egy dupla, de a tizedes (lásd: „ A lebegőpontos számok - több pontatlan, mint gondolná ” az az oka, miért).

A VB az átalakítás adunk az Ön számára a fordító:

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

Ez (double)kell kifejezetten a C #, de lehet hallgatólagos által VB több „elnéző” compiler.

Válaszolt 10/08/2008 18:54
a forrás felhasználó

szavazat
74

Miért elosztjuk 5000? Csak állítsa be a trackbar a minimum és maximum értékek 0 és 100 között, majd elosztjuk az érték 100 az Opacity százalékban. A minimális 20 alábbi példa megakadályozza formájában váljon teljesen láthatatlan:

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;
}
Válaszolt 21/09/2008 04:51
a forrás felhasználó

szavazat
45

Akkor érdemes használni 5000.0, hanem 5000.

Válaszolt 20/11/2008 15:36
a forrás felhasználó

szavazat
57

Van két probléma. Először is, Opacityigényel egy dupla, nem decimális érték. A fordító azt mondja, hogy amíg van egy konverzió között tizedes és a kettős, vagy explicit konverziót, hogy meg kell határozni annak érdekében, hogy működjön. A második az, hogy TrackBar.Valueegy egész értéket, és elosztjuk int egy int eredményez int nem számít, hogy milyen típusú változót megadja azt. Ebben az esetben van egy implicit öntött int decimális vagy kettős -, mert nincs veszteség a pontosság, ha nem a leadott - ezért a fordító nem panaszkodik, de az érték kapsz mindig 0, feltehetően, mert trackBar.Valuemindig kevesebb, mint 5000. a megoldás az, hogy változtassa meg a kódot kell használni kettős (natív típusú átlátszatlan), és nem lebegőpontos aritmetikai explicit hogy az állandó kettős - amely azzal a hatással jár, hogy támogassák a számtani - vagy öntéssel trackBar.Valuemegduplázódik, ami nem ugyanaz a dolog - vagy mindkettő. Ja, és akkor nem kell a közbenső változó, kivéve, ha másra. Az a gyanúm, a fordító optimalizálja el, egyébként.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Válaszolt 27/02/2009 12:45
a forrás felhasználó

szavazat
44

Az Opacity ingatlan kettős jellege:

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

vagy egyszerűen:

this.Opacity = trackBar1.Value / 5000.0;

vagy:

this.Opacity = trackBar1.Value / 5000d;

Figyeljük meg, hogy én vagyok a 5000.0(vagy 5000d) a hatályos kettős részlege, mert trackBar1.Valueegy egész, és ez végre egy osztás és az eredmény egész szám lehet.

Válaszolt 31/08/2011 20:08
a forrás felhasználó

szavazat
42

Feltételezve, hogy használ WinForms, Form.Opacityaz a típus double, így kell használni:

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

Ha nem kell az értéket máshol, ez egyszerűbb írni:

this.Opacity = trackBar1.Value / 5000.0;

Az ok a vezérlés nem működik, ha változik a kód egyszerűen egy kettős volt, mert volt:

double trans = trackbar1.Value / 5000;

amely értelmezte az 5000egész számként, így a transértéke mindig nulla. Azáltal, kifejezetten, hogy a numerikus egy lebegőpontos értéket úgy, hogy a .0fordítóprogram már értelmezni, mint egy dupla és végezze el a megfelelő számítást.

Válaszolt 31/08/2011 20:09
a forrás felhasználó

szavazat
38

A legjobb megoldás:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Válaszolt 06/03/2012 09:07
a forrás felhasználó

szavazat
37

Mivel Opacityegy dupla értéket, csak annyit használjon dupla kezdettől fogva, és nem öntött egyáltalán, de biztos, hogy egy kettős, ha elosztjuk, így nem vész el a precíziós

Opacity = trackBar1.Value / 5000.0;
Válaszolt 13/05/2012 03:10
a forrás felhasználó

szavazat
31
this.Opacity = trackBar1.Value / 5000d;
Válaszolt 11/04/2013 16:08
a forrás felhasználó

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