Konverter Desimal å doble?

stemmer
573

Jeg vil bruke et spor-bar for å endre et skjema opasitet.

Dette er min kode:

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

Når jeg bygge programmet, gir det følgende feil:

Kan implisitt ikke konvertere typen 'decimal'til 'double'.

Jeg prøvde å bruke transog double, men da kontrollen ikke fungerer. Denne koden fungerte fint i et tidligere VB.NET prosjekt.

Publisert på 31/07/2008 klokken 21:42
kilden bruker
På andre språk...                            


13 svar

stemmer
401

En eksplisitt konvertering til å doble som dette er ikke nødvendig:

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

Identifisere konstant som 5000.0(eller i 5000d) er tilstrekkelig:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Svarte 31/07/2008 kl. 22:17
kilden bruker

stemmer
117

En mer generisk svar for den generiske spørsmålet "Decimal vs Double?": Desimal for monetære beregninger for å bevare presisjonen, Double for vitenskapelige beregninger som ikke blir berørt av små forskjeller. Siden dobbelt er en type som er native til CPU-en (intern representasjon er lagret i bunnen 2 ), beregninger gjort med dobbelt utføre bedre deretter Desimal (som er representert i basis 10 innvendig).

Svarte 01/08/2008 kl. 14:23
kilden bruker

stemmer
76

Koden fungerte fint i VB.NET, fordi det implisitt gjør noen kaster, mens C # har både implisitte og eksplisitte seg.

I C # er konvertering fra desimal til å doble eksplisitt som du mister nøyaktighet. For eksempel 1.1 kan ikke være nøyaktig uttrykt som en dobbel, men kan som en desimal (se " flyttall - mer unøyaktige enn du tror " for grunnen).

I VB konverteringen ble lagt for deg av kompilatoren:

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

Det (double)må nevnes eksplisitt i C #, men kan bli implisert av VB er mer 'tilgivende' kompilatoren.

Svarte 10/08/2008 kl. 17:54
kilden bruker

stemmer
74

Hvorfor er du dividere med 5000? Bare still Trackbar minimums- og maksimumsmål verdier mellom 0 og 100, og deretter dele verdien med 100 for Opacity prosentandel. Den minimale 20 Eksemplet under hindrer form blir helt usynlig:

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;
}
Svarte 21/09/2008 kl. 03:51
kilden bruker

stemmer
57

Du har to problemer. Først Opacitykrever en dobbel, ikke en desimal verdi. Kompilatoren er å fortelle deg at selv om det er en konvertering mellom desimal og dobbel, er det en eksplisitt konvertering som du må angi for at det skal fungere. Det andre er at TrackBar.Valueer et heltall og dividere et mellomprodukt ved en int resulterer i et mellomprodukt, uansett hvilken type av variabel man tilordne den til. I dette tilfellet er det en implisitt kastet fra int til desimal eller dobbelt - fordi det ikke er tap av presisjon når du gjør kastet - så kompilatoren klager ikke, men verdien du får er alltid 0, antagelig, siden trackBar.Valuedet alltid mindre enn 5000. løsningen er å endre koden for å bruke dobbel (den native type for opasitet) og do flytende punktet aritmetiske ved eksplisitt å gjøre det konstante en dobbel - som vil ha den virkning av å fremme den aritmetiske - eller støpe trackBar.Valueå doble, hvilken vil gjøre det samme - eller begge deler. Oh, og du trenger ikke det mellomliggende variabel med mindre det brukes andre steder. Min gjetning er kompilatoren vil optimalisere den bort, uansett.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Svarte 27/02/2009 kl. 11:45
kilden bruker

stemmer
55

Etter min mening er det ønskelig å være så tydelig som mulig. Dette legger klarhet i koden og hjelpemidler de andre programmerere som til slutt kan lese det.

I tillegg til (eller i stedet for) å legge en .0til nummeret, kan du bruke decimal.ToDouble().

Her er noen eksempler:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Svarte 05/08/2008 kl. 20:18
kilden bruker

stemmer
54

Det høres ut som this.Opacityen dobbel verdi, og kompilatoren ikke liker det du prøver å stappe en desimal verdi i den.

Svarte 01/08/2008 kl. 13:53
kilden bruker

stemmer
45

Du bør bruke 5000.0i stedet for 5000.

Svarte 20/11/2008 kl. 14:36
kilden bruker

stemmer
44

Den Opacity Eiendommen er av dobbel Type:

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

eller rett og slett:

this.Opacity = trackBar1.Value / 5000.0;

eller:

this.Opacity = trackBar1.Value / 5000d;

Legg merke til at Jeg bruker 5000.0(eller 5000d) for å tvinge en dobbelt divisjon grunn trackBar1.Valueer et helt tall, og det ville utføre et heltall divisjon, og resultatet vil være et helt tall.

Svarte 31/08/2011 kl. 19:08
kilden bruker

stemmer
42

Antar du bruker WinForms, Form.Opacityer av type double, så du bør bruke:

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

Med mindre du trenger verdien andre steder, er det enklere å skrive:

this.Opacity = trackBar1.Value / 5000.0;

Årsaken kontrollen fungerer ikke når du endret koden for å rett og slett være en dobbel var fordi du hadde:

double trans = trackbar1.Value / 5000;

som tolket 5000som et heltall, slik at transverdien var alltid null. Ved eksplisitt å gjøre det numeriske et flyttall ved tilsetning av .0kompilatoren kan nå tolke det som en dobbel, og utføre den riktige beregningen.

Svarte 31/08/2011 kl. 19:09
kilden bruker

stemmer
38

Den beste løsningen er:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Svarte 06/03/2012 kl. 08:07
kilden bruker

stemmer
37

Siden Opacityer en dobbel verdi, ville jeg bare bruke en dobbel fra begynnelsen, og ikke kaste det hele tatt, men sørg for å bruke en dobbel når dele slik at du ikke mister noen presisjon

Opacity = trackBar1.Value / 5000.0;
Svarte 13/05/2012 kl. 02:10
kilden bruker

stemmer
31
this.Opacity = trackBar1.Value / 5000d;
Svarte 11/04/2013 kl. 15:08
kilden bruker

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