799 Stimmen

Wie konvertiert man eine Dezimalzahl in ein Double in C#?

Ich möchte eine Track-Bar zu ändern. Form der Opazität.

Dies ist mein Code:

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

Beim Erstellen der Anwendung wird folgende Fehlermeldung angezeigt:

Cannot implicitly convert type decimal to double

Ich habe versucht, mit trans y double aber dann die Control funktioniert nicht. Dieser Code funktionierte gut in einem früheren VB.NET-Projekt.

20 Stimmen

Außerdem kann Decimal keinen so großen Wert wie Double darstellen. Decimal kann nur bis zu +/-7.9228162514264337593543950335E+28 gehen, während Double bis zu +/-1.79769313486232E+308 gehen kann.

4 Stimmen

@TraumaPony es ist ein trackbar . Es ist unwahrscheinlich, dass jemals ein so hoher Wert für trackbar

6 Stimmen

Mir wurde immer gesagt, es sei besser, mit 0,0002 zu multiplizieren als durch 5000 zu teilen.

529voto

Kevin Dente Punkte 24334

Ein expliziter Wurf nach double als wäre das nicht nötig:

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

Die Identifizierung der Konstante als 5000.0 (oder als 5000d ) ist ausreichend:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;

0 Stimmen

"trans" ist wahrscheinlich für " Transparenz "

151voto

huseyint Punkte 14760

Eine allgemeinere Antwort auf die allgemeine Frage "Dezimal oder Double?":

Dezimal ist für monetäre Berechnungen zur Wahrung der Genauigkeit. Doppelter ist für wissenschaftliche Berechnungen gedacht, die nicht durch kleine Unterschiede beeinträchtigt werden. Da Double ein CPU-eigener Typ ist (die interne Darstellung ist in Basis 2 ), funktionieren Berechnungen mit Double besser als mit Decimal (das in Basis 10 intern).

108voto

Keith Punkte 141163

Ihr Code funktionierte gut in VB.NET, weil es implizit tut alle Casts, während C# hat sowohl implizite und explizite ein.

In C# ist die Konvertierung von dezimal nach double explizit, da Sie die Genauigkeit verlieren. Zum Beispiel kann 1.1 nicht genau als Double ausgedrückt werden, aber als Dezimalzahl (siehe " Fließkommazahlen - ungenauer als man denkt " für den Grund dafür).

In VB wurde die Konvertierung vom Compiler für Sie vorgenommen:

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

Das (double) muss in C# explizit angegeben werden, kann aber implizit durch VBs 'verzeihenderen' Compiler.

97voto

Gordon Bell Punkte 12689

Warum dividieren Sie durch 5000? Legen Sie einfach die Minimal- und Maximalwerte des TrackBars zwischen 0 und 100 fest und teilen Sie dann den Wert durch 100 für den Prozentsatz der Deckkraft. Das folgende Beispiel mit einem Mindestwert von 20 verhindert, dass das Formular vollständig unsichtbar wird:

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;
}

9 Stimmen

Würde dies das Problem nicht nur verlagern? Anstatt ein Problem mit 5000 würde OP ein Problem haben mit 100 ?

77voto

tvanfosson Punkte 506878

Sie haben zwei Probleme.

Erstens, Opacity erfordert einen Double- und keinen Dezimalwert. Der Compiler teilt Ihnen mit, dass es zwar eine Umwandlung zwischen Dezimal- und Double-Werten gibt, dass es sich aber um eine explizite Umwandlung handelt, die Sie angeben müssen, damit sie funktioniert.

Zweitens, TrackBar.Value ist ein Integer-Wert und die Division eines int durch einen int ergibt einen int, unabhängig davon, welcher Art von Variable Sie ihn zuweisen. In diesem Fall gibt es eine implizite Umwandlung von int in decimal oder double, da es bei der Umwandlung keinen Präzisionsverlust gibt. Der Compiler beschwert sich also nicht. Aber der Wert, den Sie erhalten, ist immer 0, vermutlich, weil trackBar.Value ist immer kleiner als 5000.

Die Lösung besteht darin, den Code so zu ändern, dass double (der native Typ für Opacity) verwendet wird, und die Fließkomma-Arithmetik durchzuführen, indem die Konstante explizit zu double gemacht wird, was zur Folge hat, dass die Arithmetik oder das Casting beschleunigt wird trackBar.Value zu verdoppeln, was das Gleiche bewirkt oder beides. Sie brauchen die Zwischenvariable nicht, es sei denn, sie wird anderweitig verwendet. Ich vermute, dass der Compiler sie ohnehin wegoptimieren würde.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X