c# - Konvertieren Sie Dezimal in Double

Translate

Ich möchte eine Spurleiste verwenden, um die Deckkraft eines Formulars zu ändern.

Das ist mein Code:

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

Wenn ich die Anwendung erstelle, wird der folgende Fehler angezeigt:

Typ kann nicht implizit konvertiert werdendecimalzudouble

Ich habe es versuchttransunddoubleaber dann funktioniert die Steuerung nicht. Dieser Code hat in einem früheren VB.NET-Projekt einwandfrei funktioniert.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Eine explizite Besetzung, um so zu verdoppeln, ist nicht erforderlich:

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

Identifizieren der Konstante als5000.0(oder als5000d) ist genügend:

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

Eine allgemeinere Antwort auf die generische Frage "Decimal vs Double?":Dezimalfür monetäre Berechnungen zur Wahrung der Präzision,Doppeltfür wissenschaftliche Berechnungen, die nicht von kleinen Unterschieden betroffen sind. Da Double ein Typ ist, der der CPU eigen ist (interne Darstellung wird in gespeichertBasis 2), Berechnungen mit Double sind besser als Decimal (dargestellt inBasis 10im Inneren).

Quelle
Translate

Ihr Code hat in VB.NET einwandfrei funktioniert, da er implizit alle Casts ausführt, während C # sowohl implizite als auch explizite Casts enthält.

In C # ist die Konvertierung von dezimal nach doppelt explizit, da Sie an Genauigkeit verlieren. Zum Beispiel kann 1.1 nicht genau als Doppel ausgedrückt werden, sondern als Dezimalzahl (siehe "Gleitkommazahlen - ungenauer als Sie denken"aus dem Grund warum).

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

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

Das(double)muss explizit in C # angegeben werden, kann aber seinimpliziertvon VBs eher "verzeihendem" Compiler.

Quelle
Translate

Warum dividierst du durch 5000? Stellen Sie einfach die Minimal- und Maximalwerte der TrackBar zwischen 0 und 100 ein und dividieren Sie den Wert durch 100 für den Deckkraftprozentsatz. Das folgende Beispiel mit mindestens 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;
}
Quelle
Translate

Sie haben zwei Probleme. Zuerst,Opacityerfordert einen doppelten Wert, keinen Dezimalwert. Der Compiler teilt Ihnen mit, dass es zwar eine Konvertierung zwischen Dezimal und Doppel gibt, es sich jedoch um eine explizite Konvertierung handelt, die Sie angeben müssen, damit sie funktioniert. Das zweite ist dasTrackBar.Valueist ein ganzzahliger Wert, und das Teilen eines int durch ein int führt zu einem int, unabhängig davon, welcher Art von Variable Sie es zuweisen. In diesem Fall gibt es eine implizite Umwandlung von int in dezimal oder doppelt - da bei der Umwandlung kein Genauigkeitsverlust auftritt - der Compiler beschwert sich also nicht, aber der Wert, den Sie erhalten, ist vermutlich immer 0, datrackBar.Valueist immer kleiner als 5000. Die Lösung besteht darin, Ihren Code so zu ändern, dass double (der native Typ für Deckkraft) und Gleitkomma-Arithmetik verwendet wird, indem die Konstante explizit zu einem Double gemacht wird - was die Arithmetik fördert - oder das CastingtrackBar.Valuezu verdoppeln, was das gleiche tun wird - oder beides. Oh, und Sie brauchen die Zwischenvariable nur, wenn sie anderweitig verwendet wird. Ich vermute, der Compiler würde es sowieso weg optimieren.

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

Meiner Meinung nach ist es wünschenswert, so explizit wie möglich zu sein. Dies erhöht die Klarheit des Codes und hilft Ihren Programmierkollegen, die ihn möglicherweise lesen.

Zusätzlich zum (oder anstelle von) Anhängen von a.0zu der Nummer können Sie verwendendecimal.ToDouble().

Hier sind einige Beispiele:

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

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

Das klingt nachthis.Opacityist ein doppelter Wert, und der Compiler mag es nicht, wenn Sie versuchen, einen Dezimalwert hineinzu stopfen.

Quelle
Translate

Du solltest benutzen5000.0Anstatt von5000.

Quelle
Translate

DasOpazitätEigenschaft ist vom doppelten Typ:

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

oder einfach:

this.Opacity = trackBar1.Value / 5000.0;

oder:

this.Opacity = trackBar1.Value / 5000d;

Beachten Sie, dass ich benutze5000.0(oder5000d) eine doppelte Teilung erzwingen, weiltrackBar1.Valueist eine Ganzzahl und würde eine Ganzzahldivision durchführen und das Ergebnis wäre eine Ganzzahl.

Quelle
Translate

Angenommen, Sie verwenden WinForms.Form.Opacityist vom Typdouble, also sollten Sie verwenden:

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

Sofern Sie den Wert nicht an anderer Stelle benötigen, ist es einfacher zu schreiben:

this.Opacity = trackBar1.Value / 5000.0;

Der Grund, warum das Steuerelement nicht funktioniert, wenn Sie Ihren Code so geändert haben, dass er einfach doppelt ist, war, dass Sie:

double trans = trackbar1.Value / 5000;

die interpretierte die5000als ganze Zahl und weiltrackbar1.Valueist auch eine ganze Zahl deintransWert war immer Null. Indem Sie die Zahl explizit zu einem Gleitkommawert machen, indem Sie die Zahl hinzufügen.0Der Compiler kann es nun als Double interpretieren und die richtige Berechnung durchführen.

Quelle
Translate

Die beste Lösung ist:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Quelle
Translate

Schon seitOpacityist ein doppelter Wert, ich würde von Anfang an nur ein Double verwenden und überhaupt nicht werfen, aber beim Teilen unbedingt ein Double verwenden, damit Sie keine Präzision verlieren

Opacity = trackBar1.Value / 5000.0;
Quelle
Translate
this.Opacity = trackBar1.Value / 5000d;
Quelle