Während Opazität in eine Form anwenden, sollten wir eine Dezimalzahl oder einen doppelten Wert verwenden?

stimmen
557

Ich möchte einen Track-Bar verwenden, um eine Opazität des Formulars zu ändern.

Dies ist mein Code:

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

Wenn ich die Anwendung zu erstellen, gibt es folgende Fehlermeldung:

Kann nicht implizit Typ konvertieren 'decimal'zu 'double'.

Ich habe versucht , mit transund doubleaber dann geht die Steuerung nicht funktionieren. Dieser Code arbeitete in einem früheren VB.NET Projekt gut.

Veröffentlicht am 31/07/2008 um 22:42
quelle vom benutzer
In anderen Sprachen...                            


13 antworten

stimmen
395

Eine explizite Umwandlung wie diese zu verdoppeln ist nicht notwendig:

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

Identifizieren der konstant 5000.0(oder als 5000d) ausreicht , um:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Beantwortet am 31/07/2008 um 23:17
quelle vom benutzer

stimmen
114

Eine allgemeine Antwort auf die allgemeine Frage „Dezimal vs Doppel?“: Dezimal für das Geld Berechnungen die Genauigkeit zu erhalten, die Doppel für wissenschaftliche Berechnungen , die durch kleine Unterschiede betroffen nicht bekommen. Da Doppel ein Typ ist, der mit der CPU nativ ist (interne Darstellung wird in gespeicherten Basis 2 ) mit Doppel Berechnungen eine bessere Leistung dann Decimal (die in dargestellt ist , 10 Base intern).

Beantwortet am 01/08/2008 um 15:23
quelle vom benutzer

stimmen
75

Ihr Code hat gut funktioniert in VB.NET, weil es implizit alle Abgüsse der Fall ist, während C # sowohl implizite und explizite diejenigen hat.

In C # aus Dezimalzahl die Umwandlung zu verdoppeln ist explizit wie Sie Genauigkeit verlieren. Zum Beispiel 1.1 kann nicht genau als Doppel ausgedrückt werden, sondern als Dezimalzahl kann (siehe „ Gleitkommazahlen - ungenauer als Sie denken “ für den Grund , warum).

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

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

Das (double)muss explizit in C # angegeben, kann aber werden impliziert durch VB mehr ‚nachsichtig‘ Compiler.

Beantwortet am 10/08/2008 um 18:54
quelle vom benutzer

stimmen
74

Warum Dividieren Sie von 5000? Setzen Sie einfach das Minimum des TrackBar und Höchstwerte zwischen 0 und 100 und dann den Wert von 100 für die Opazität Prozentsatz teilen. Das Minimum 20 Beispiel verhindert, dass die folgende Formular aus immer völlig unsichtbar:

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;
}
Beantwortet am 21/09/2008 um 04:51
quelle vom benutzer

stimmen
57

Sie haben zwei Probleme. Erstens Opacityerfordert einen doppelten, nicht einen Dezimalwert. Der Compiler sagt Ihnen , dass es zwar eine Umwandlung zwischen dezimal und doppelt so hoch ist, ist es eine explizite Konvertierung , die Sie , um angeben müssen , damit es funktioniert. Der zweite ist , dass TrackBar.Valueein ganzzahliger Wert ist, und ganz gleich , einen int durch einen int führt zu einer int Dividieren welche Art von Variable Sie es zuzuweisen. In diesem Fall gibt es eine implizite Umwandlung von int oder double in Dezimalzahlen - weil es keinen Verlust an Präzision, wenn Sie tun , um die Besetzung - so dass der Compiler beschwert sich nicht, aber der Wert , den Sie erhalten , ist immer 0, vermutlich, datrackBar.Valueimmer weniger als 5000. Die Lösung ist , Ihren Code zu ändern doppelt zu verwenden (die native Typ für Opazität) und Point - Arithmetik kann schwimmend durch explizit die Konstante macht eine Doppel - , die die Wirkung der Förderung der Arithmetik haben - oder Gießen trackBar.Valuezu verdoppeln , die das gleiche tun - oder beides. Oh, und Sie brauchen nicht auf die Zwischengröße , wenn es an anderer Stelle verwendet. Meine Vermutung ist , der Compiler es weg optimieren würde, sowieso.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Beantwortet am 27/02/2009 um 12:45
quelle vom benutzer

stimmen
55

Meiner Meinung nach ist es wünschenswert, so explizit wie möglich zu sein. Dies trägt zur Klärung der Code und hilft Ihre Kollegen Programmierer, die es schließlich lesen kann.

Zusätzlich zu (oder anstelle von) einem Anhang .0an die Nummer, die Sie verwenden können decimal.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);
Beantwortet am 05/08/2008 um 21:18
quelle vom benutzer

stimmen
53

Es klingt wie this.Opacityein doppelter Wert ist, und der Compiler nicht wie Sie einen Dezimalwert hinein zu stopfen versucht.

Beantwortet am 01/08/2008 um 14:53
quelle vom benutzer

stimmen
45

Sie sollten verwenden 5000.0statt 5000.

Beantwortet am 20/11/2008 um 15:36
quelle vom benutzer

stimmen
44

Die Opazität Eigenschaft ist von Doppeltyp:

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 bin mit 5000.0(oder 5000d) eine doppelte Teilung zu zwingen , weil trackBar1.Valueeine ganze Zahl ist , und es wäre eine Integer - Division durchführen und das Ergebnis wäre eine ganze Zahl sein.

Beantwortet am 31/08/2011 um 20:08
quelle vom benutzer

stimmen
42

Angenommen , Sie verwenden WinForms, Form.Opacityder Typ ist double, so sollten Sie verwenden:

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

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

this.Opacity = trackBar1.Value / 5000.0;

Der Grund für die Steuerung funktioniert nicht, wenn Sie Ihren Code geändert, um einfach ein doppelt so hoch zu sein, weil Sie hatte:

double trans = trackbar1.Value / 5000;

die interpretierten die 5000als eine ganze Zahl, so dass Ihretrans Wert war immer Null. Durch die expliziten den numerischen einen Gleitkommawert macht durch die Zugabe .0der Compiler können nun als Doppel interpretieren und die richtige Berechnung durchführen.

Beantwortet am 31/08/2011 um 20:09
quelle vom benutzer

stimmen
38

Die beste Lösung ist:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Beantwortet am 06/03/2012 um 09:07
quelle vom benutzer

stimmen
37

Da Opacityein doppelter Wert ist, würde ich eine doppelte von Anfang an verwenden Sie einfach und schon gar nicht werfen, aber sicher sein , eine doppelte zu verwenden , wenn Dividieren so tun verlieren Sie keine Präzision

Opacity = trackBar1.Value / 5000.0;
Beantwortet am 13/05/2012 um 03:10
quelle vom benutzer

stimmen
31
this.Opacity = trackBar1.Value / 5000d;
Beantwortet am 11/04/2013 um 16:08
quelle vom benutzer

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