Conversia Zecimal la Dublu

Vreau să folosesc un track-bar pentru a schimba o forma's opacitate.

Acesta este codul meu:

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

Când am construi la cerere, se da urmatoarea eroare:

nu Poate converti implicit de tip zecimal` la "dublu"

Am încercat, folosind "trans" și "dublu" dar atunci de control nu't de lucru. Acest cod a funcționat bine în trecut VB.NET proiect.

Comentarii la întrebare (2)
Soluția

O explicit exprimate la "dublu" ca e't este necesar:

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

Identificarea constantă ca 5000.0 (sau 5000d) este suficientă:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Comentarii (0)

O mai generic răspuns pentru întrebare generică "Zecimal vs Dublu?": Zecimal pentru calculele monetare pentru a păstra precizie, Dubla pentru calcule științifice care nu obține afectate cu mici diferențe. Deoarece Dubla este un tip care este nativ pentru CPU (reprezentare internă sunt stocate în baza 2), calcule făcute cu Dublu efectua mai bine atunci Zecimal (care este reprezentat în baza 10 pe plan intern).

Comentarii (0)

Codul a lucrat bine în VB.NET pentru că, implicit, nu orice aruncă, în timp ce C# are atât implicite și explicite.

În C# conversia din zecimal în dublă este explicit ca pierzi precizie. De exemplu 1.1 poate't fi exprimat cu precizie ca o dublă, dar poate ca o zecimală (a se vedea "numere în virgulă mobilă - mai inexact decât crezi" pentru motivul de ce).

În VB de conversie a fost adaugat pentru tine de compilator:

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

(dublu) trebuie să fie menționat în mod explicit în C#, dar pot fi implicit de VB's mai 'iertător' compiler.

Comentarii (0)

De ce te împărțirea de 5000? Doar seta TrackBar's valorile Maxime și Minime între 0 și 100 și apoi împărțiți Valoarea de 100 de Opacitate procentuale. Minim 20 exemplul de mai jos previne formă de a deveni complet invizibil:

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;
}
Comentarii (1)

Aveți două probleme. În primul rând, Opacitate necesită o dublă, nu o valoare zecimală. Compilatorul este de a spune că în timp ce există o conversie între zecimal și dublu, este o conversie explicită de care aveți nevoie să specificați în comandă pentru a funcționa. Al doilea este că TrackBar.Valoarea este o valoare întreagă și împărțind-o int de un int rezultatele într-un int indiferent de ce tip de variabilă atribuiți-l la. În acest caz, există o implicit cast la int la decimal sau double - pentru că nu există nici o pierdere de precizie atunci când faci cast - deci compilatorul nu't se plâng, dar valoarea pe care o obține este întotdeauna 0, probabil, dintrackBar.Valoarea este întotdeauna mai mică decât 5000. Soluția este de a schimba codul de a utiliza dublu (nativ tip de Opacitate) și de a face în virgulă mobilă aritmetică explicit de a face constant un dublu - care va avea ca efect promovarea aritmetică - sau turnare `trackBar.Valoarea sa de dublu, care va face același lucru - sau ambele. Oh, și tu nu't nevoie de variabile intermediare dacă este utilizat și în altă parte. Parerea mea este compilatorul ar optimiza departe, oricum.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Comentarii (0)

În opinia mea, este de dorit să fie cât mai explicit posibil. Acest lucru aduce un plus de claritate a codului și ajută colegii programatori care ar putea în cele din urmă a citit-o.

În plus față de (sau în loc de) adăugarea unui .0 la număr, puteți folosi zecimale.ToDouble()`.

Aici sunt câteva exemple:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Comentarii (0)

Se pare ca asta.Opacitatea este o valoare dublă, iar compilatorul nu't ca tine încercarea de a se ghiftui o valoare zecimală în ea.

Comentarii (0)

Ar trebui să utilizați 5000.0 "în loc de" 5000.

Comentarii (0)

De Opacitate proprietatea este de tip double:

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

sau pur și simplu:

this.Opacity = trackBar1.Value / 5000.0;

sau:

this.Opacity = trackBar1.Value / 5000d;

Observați că eu sunt, folosind 5000.0 "(sau " 5000d) pentru a forța un dublu divizia pentru că trackBar1.Valoarea este un număr întreg și se va efectua un număr întreg de divizie, iar rezultatul va fi un număr întreg.

Comentarii (0)

Presupunând că utilizați WinForms, Forma.Opacitate este de tip "dublu", așa că ar trebui să utilizați:

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

Dacă nu aveți nevoie de valoarea în altă parte, l's simplu să scrie:

this.Opacity = trackBar1.Value / 5000.0;

Motivul pentru care controlul nu't de lucru atunci când ți-ai schimbat codul pentru a fi pur și simplu un dublu fost pentru că ai avut:

double trans = trackbar1.Value / 5000;

care a interpretat 5000 ca un întreg, și pentru că trackbar1.Valoarea este, de asemenea, un număr întreg tău "trans" valoare a fost întotdeauna zero. În mod explicit a face numeric, o valoare în virgulă mobilă prin adăugarea.0` compilatorul poate interpreta ca o dublă și de a efectua calcul corespunzătoare.

Comentarii (0)

Cea mai bună soluție este:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Comentarii (0)

Din Opacitate` este o valoare dublă, mi-ar folosi doar un dublu de la început și nu arunca deloc, dar asigurați-vă că pentru a utiliza un dublu când împărțirea, astfel încât să don't pierde orice precizie

Opacity = trackBar1.Value / 5000.0;
Comentarii (0)
this.Opacity = trackBar1.Value / 5000d;
Comentarii (0)