Hoewel het aanbrengen van dekking op een formulier, moeten we een decimaal of een dubbele waarde gebruiken?

stemmen
557

Ik wil een track-bar gebruiken om de dekking van een formulier wijzigen.

Dit is mijn code:

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

Toen ik de applicatie te bouwen, geeft de volgende foutmelding:

Kan niet impliciet het type om te zetten 'decimal'naar 'double'.

Ik heb geprobeerd met behulp van transen doublemaar dan is het niet werkt. Deze code werkte prima in een vorig VB.NET project.

De vraag is gesteld op 31/07/2008 om 22:42
bron van user
In andere talen...                            


13 antwoorden

stemmen
395

Een expliciete cast te verdubbelen als dit niet nodig is:

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

Het identificeren van de constant 5000.0(of 5000d) voldoende:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
antwoordde op 31/07/2008 om 23:17
bron van user

stemmen
53

Het klinkt als this.Opacityeen dubbele waarde, en de compiler niet alsof je probeert om een decimale waarde proppen erin.

antwoordde op 01/08/2008 om 14:53
bron van user

stemmen
114

Een meer algemene antwoord op de algemene vraag "Decimal vs Double?": Decimal voor het monetaire berekeningen om de precisie, behouden Double voor wetenschappelijke berekeningen die niet worden aangetast door de kleine verschillen. Aangezien Double is een soort die deel uitmaakt van de CPU (interne representatie wordt opgeslagen in basis 2 ), berekeningen met Double beter presteren dan decimaal (die is weergegeven in basis 10 intern).

antwoordde op 01/08/2008 om 15:23
bron van user

stemmen
55

Naar mijn mening is het wenselijk zo expliciet mogelijk te zijn. Dit zorgt voor meer duidelijkheid om de code en helpt uw ​​collega-programmeurs die uiteindelijk kan lezen.

In aanvulling op (of in plaats van) het toevoegen van een .0aan het nummer, kunt u gebruik maken decimal.ToDouble().

Hier zijn enkele voorbeelden:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
antwoordde op 05/08/2008 om 21:18
bron van user

stemmen
75

Uw code werkte prima in VB.NET, omdat het impliciet doet elke casts, terwijl de C # heeft zowel impliciete en expliciete.

In C # de conversie van decimaal te verdubbelen is expliciet als je nauwkeurigheid te verliezen. Bijvoorbeeld 1.1 niet nauwkeurig kunnen worden uitgedrukt als een dubbel, maar kan als decimaal (zie " floating point getallen - onnauwkeuriger dan je denkt " voor de reden waarom).

In VB is de conversie voor u toegevoegd door de compiler:

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

Dat (double)moet expliciet worden vermeld in C #, maar kan worden geïmpliceerd door meer 'vergevingsgezind' samensteller VB's.

antwoordde op 10/08/2008 om 18:54
bron van user

stemmen
74

Waarom bent u te delen door 5000? set Alleen de TrackBar de minimale en maximale waarden tussen 0 en 100 en vervolgens delen van de waarde van 100 voor de dekking percentage. onder de minimale 20 voorkomt bijvoorbeeld dat de vorm van steeds onzichtbaar:

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;
}
antwoordde op 21/09/2008 om 04:51
bron van user

stemmen
45

U moet gebruiken 5000.0in plaats van 5000.

antwoordde op 20/11/2008 om 15:36
bron van user

stemmen
57

Je hebt twee problemen. In de eerste plaats Opacityvereist een dubbele, niet een decimale waarde. De compiler vertelt u dat terwijl er een conversie tussen decimaal en dubbel, het is een expliciete conversie die je nodig hebt om aan te geven om het te laten werken. De tweede is dat TrackBar.Valueeen integer waarde en een int door een int resulteert in een int te delen, ongeacht wat voor soort variabele die u aan te wijzen. In dit geval is er een impliciete cast van int naar decimaal of dubbele - want er is geen verlies van precisie wanneer u de cast doet - dus de compiler niet klagen, maar de waarde die u krijgt is altijd 0, vermoedelijk omdat trackBar.Valuealtijd minder dan 5000. de oplossing is om uw code te wijzigen om dubbele (de inheemse soort voor Dekking) gebruiken en geen floating point berekeningen door het expliciet maken van de constante a double - die het effect van het bevorderen van het rekenkundig zal hebben - of gieten trackBar.Valuete verdubbelen, die of beide - zal hetzelfde doen. Oh, en je hoeft niet de tussenliggende variabele nodig, tenzij het elders. Mijn gok is de compiler zou het optimaliseren weg, toch.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
antwoordde op 27/02/2009 om 12:45
bron van user

stemmen
44

De Dekking eigenschap is van de dubbele het type:

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

of gewoon:

this.Opacity = trackBar1.Value / 5000.0;

of:

this.Opacity = trackBar1.Value / 5000d;

Merk op dat ik gebruik 5000.0(of 5000d) een dubbele verdeling forceren omdat trackBar1.Valueeen geheel getal zou een gehele deling uitvoert en het resultaat zou een geheel getal zijn.

antwoordde op 31/08/2011 om 20:08
bron van user

stemmen
42

Ervan uitgaande dat u gebruik maakt van Windows Forms, Form.Opacityis van het type double, dus je moet gebruiken:

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

Tenzij u de waarde elders nodig hebben, is het eenvoudiger om te schrijven:

this.Opacity = trackBar1.Value / 5000.0;

De reden dat de besturing werkt niet wanneer u uw code veranderd om gewoon te zijn van een dubbele was omdat je had:

double trans = trackbar1.Value / 5000;

die geïnterpreteerd het 5000als een geheel, zodat uw transwaarde altijd nul. Door het expliciet maken van de numerieke een floating point waarde door toevoeging van de .0de compiler kan nu interpreteren als een dubbele en het uitvoeren van de juiste berekening.

antwoordde op 31/08/2011 om 20:09
bron van user

stemmen
38

De beste oplossing is:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
antwoordde op 06/03/2012 om 09:07
bron van user

stemmen
37

Daar Opacityis een dubbele waarde, dan zou ik gewoon gebruik maken van een dubbele vanaf het begin en helemaal niet uitgebracht, maar zorg ervoor dat een dubbele gebruiken bij het verdelen, zodat je geen precisie los

Opacity = trackBar1.Value / 5000.0;
antwoordde op 13/05/2012 om 03:10
bron van user

stemmen
31
this.Opacity = trackBar1.Value / 5000d;
antwoordde op 11/04/2013 om 16:08
bron van user

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