Dezimal in Doppel konvertieren?

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

    Dies ist mein Code:

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

    Beim Erstellen der Anwendung wird der folgende Fehler angezeigt:

    Der Typ 'decimal' kann nicht implizit in 'double' konvertiert werden.

    Ich habe versucht, trans und double zu verwenden, aber das Steuerelement tut dies nicht Arbeit. Dieser Code hat in einem früheren VB.NET-Projekt gut funktioniert.

    02 July 2018
    Joel Spolsky
13 answers
  • Eine explizite Umwandlung dieser Art ist nicht erforderlich:

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

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

     double trans = trackBar1.Value / 5000.0;
    double trans = trackBar1.Value / 5000d;
     
    16 December 2017
    user4020527Kevin Dente
  • Eine allgemeinere Antwort auf die generische Frage "Dezimal vs. Doppel?": Dezimal für monetäre Berechnungen, um die Genauigkeit zu erhalten, Double für wissenschaftliche Berechnungen, die dies tun nicht von kleinen Unterschieden betroffen sein. Da Double ein Typ ist, der in der CPU enthalten ist (die interne Darstellung wird in Base 2 gespeichert), sind die mit Double durchgeführten Berechnungen besser als Decimal (die in Base 10 dargestellt wird intern).

    11 July 2014
    Sid Mhuseyint
  • Ihr Code hat in VB.NET gut funktioniert, da er implizit alle Umwandlungen ausführt, während C # sowohl implizite als auch explizite Codes enthält.

    In C # wird die Konvertierung von Dezimal nach Dezimal ausgeführt double ist explizit, da Sie an Genauigkeit verlieren. Zum Beispiel kann 1.1 nicht genau als Doppelzahl ausgedrückt werden, sondern als Dezimalzahl (siehe " Fließkommazahlen - ungenauer als Sie denken " (aus welchem ​​Grund).

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

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

    Das (double) muss explizit in C # angegeben werden, kann jedoch sein impliziert von VBs 'fehlerverzeihendem' Compiler.

    14 October 2012
    Paul FlemingChris
  • Warum teilen Sie sich durch 5000? Setzen Sie einfach die Minimum- und Maximum-Werte der TrackBar zwischen 0 und 100 und teilen Sie den Wert für den Deckkraftanteil durch 100. Das folgende Minimum-Beispiel 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;
    }
     
    01 August 2015
    Peter Mortensen
  • Sie haben zwei Probleme. Zunächst erfordert Opacity einen doppelten und keinen Dezimalwert. Der Compiler sagt Ihnen, dass es zwar eine Konvertierung zwischen Dezimal- und Doppelkommando gibt, es ist jedoch eine explizite Konvertierung, die Sie angeben müssen, damit sie funktioniert. Die zweite ist, dass TrackBar.Value ein ganzzahliger Wert ist. Wenn Sie ein int durch ein int dividieren, erhalten Sie ein int, unabhängig davon, welchem ​​Variablentyp Sie es zuweisen. In diesem Fall gibt es eine implizite Umwandlung von int in decimal oder double, da beim Cast keine Genauigkeitsverluste auftreten. Der Compiler beschwert sich nicht. Der Wert, den Sie erhalten, ist jedoch immer 0, da trackBar.Value ist immer kleiner als 5000. Die Lösung besteht darin, Ihren Code so zu ändern, dass double (der native Typ für Opacity) verwendet wird, und Fließkomma-Arithmetik auszuführen, indem Sie die Konstante explizit zu einem Double machen - was die Arithmetik fördern oder && 3&&] zu verdoppeln, was dasselbe bewirkt - oder beides. Oh, und Sie brauchen die Zwischenvariable nur, wenn sie anderswo verwendet wird. Ich vermute, der Compiler würde ihn sowieso wegoptimieren.

     trackBar.Opacity = (double)trackBar.Value / 5000.0;
     
    22 February 2018
    DezDespertar
  • Meiner Meinung nach ist es wünschenswert, so explizit wie möglich zu sein. Dies fügt dem Code Klarheit hinzu und hilft Ihren Programmierkollegen, die ihn eventuell lesen können.

    Zusätzlich zu (oder anstelle) eines .0 an die Nummer können Sie verwenden decimal.ToDouble().

    Hier 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);
     
    14 October 2012
    Paul FlemingChris
  • Es klingt so, als wäre this.Opacity ein doppelter Wert, und der Compiler mag es nicht, wenn Sie versuchen, einen Dezimalwert hineinzudrücken.

    14 October 2012
    Paul FlemingChris
  • Sie sollten 5000.0 anstelle von 5000 verwenden.

    14 October 2012
    Paul FlemingChris
  • Die Deckkraft ist doppelt:

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

    oder einfach:

     this.Opacity = trackBar1.Value / 5000.0;
     

    oder:

     this.Opacity = trackBar1.Value / 5000d;
     

    Hinweis dass ich mit 5000.0 (oder 5000d) eine doppelte Division erzwinge, weil trackBar1.Value ist eine Ganzzahl und würde eine Ganzzahldivision durchführen, und das Ergebnis wäre eine Ganzzahl.

    31 August 2011
    Darin Dimitrov
  • Angenommen, Sie verwenden WinForms Form.Opacity ist vom Typ double, daher sollten Sie Folgendes verwenden:

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

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

     this.Opacity = trackBar1.Value / 5000.0;
     

    Der Grund, warum das Steuerelement nicht funktioniert, wenn Sie Ihren Code einfach ändern ein Double war, weil Sie Folgendes hatten:

     double trans = trackbar1.Value / 5000;
     

    was die 5000 als ganze Zahl interpretierte, also Ihre trans Wert war immer Null. Indem der numerische Wert explizit durch Hinzufügen von .0 zu einem Fließkommawert gemacht wird, kann der Compiler ihn nun als ein Double interpretieren und die korrekte Berechnung durchführen.

    05 November 2015
    ChrisF