Tout en appliquant l'opacité à une forme, doit-on utiliser une décimale ou une double valeur?

voix
557

Je veux utiliser une piste barre pour changer l'opacité d'un formulaire.

Ceci est mon code:

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

Lorsque je construis l'application, il donne l'erreur suivante:

Impossible de convertir implicitement le type 'decimal'à 'double'.

J'ai essayé d' utiliser transet doublemais le contrôle ne fonctionne pas. Ce code a bien fonctionné dans un projet VB.NET passé.

Créé 31/07/2008 à 22:42
source utilisateur
Dans d'autres langues...                            


13 réponses

voix
395

Un casting explicite de doubler comme celui-ci n'est pas nécessaire:

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

L' identification de la constante 5000.0(ou selon 5000d) est suffisante:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Créé 31/07/2008 à 23:17
source utilisateur

voix
114

Une réponse plus générique pour la question générique « décimal vs double? »: Décimal pour les calculs monétaires pour préserver la précision, double pour les calculs scientifiques qui ne reçoivent pas touchés par de petites différences. Depuis Double est un type qui est originaire de la CPU (représentation interne est stockée dans la base 2 ), calculs effectués avec un meilleur rendement Double alors décimal (qui est représenté dans la base 10 à l' intérieur).

Créé 01/08/2008 à 15:23
source utilisateur

voix
75

Votre code a bien fonctionné en VB.NET, car il ne implicitement des moulages, tandis que C # a deux implicites et explicites.

En C # la conversion de décimal à double est explicite que vous perdez la précision. Par exemple 1.1 ne peut pas être correctement exprimée en double, mais peut en décimales (voir « nombres à virgule flottante - plus imprécis que vous pensez » pour la raison pour laquelle).

Dans VB la conversion pour vous a été ajouté par le compilateur:

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

Cela (double)doit être explicitement déclaré en C #, mais peut être implicite par plus compilateur « pardonner » de VB.

Créé 10/08/2008 à 18:54
source utilisateur

voix
74

Pourquoi vous divisez par 5000? Il suffit de définir les valeurs minimum et maximum de l'TrackBar entre 0 et 100, puis diviser la valeur par 100 pour le pourcentage Opacité. Le 20 exemple minimum empêche ci-dessous la forme de devenir complètement invisible:

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;
}
Créé 21/09/2008 à 04:51
source utilisateur

voix
57

Vous avez deux problèmes. Tout d' abord, il Opacityfaut un double, et non une valeur décimale. Le compilateur vous dit que si il y a une conversion entre décimal et double, il est une conversion explicite que vous devez spécifier pour que cela fonctionne. La seconde est que TrackBar.Valueest une valeur entière et en divisant un entier par un résultat int dans un int peu importe quel type de variable que vous attribuez à. Dans ce cas , il y a une conversion implicite de int en décimal ou double - parce qu'il n'y a pas de perte de précision quand vous faites le casting - de sorte que le compilateur ne se plaint pas, mais la valeur que vous obtenez est toujours 0, sans doute, puisquetrackBar.Valueest toujours inférieure à 5000. La solution est de changer votre code pour utiliser le double (le type natif pour Opacité) et ne arithmétique en virgule flottante en faisant explicitement la constante double - ce qui aura pour effet de favoriser l'arithmétique - ou coulée trackBar.Valuede doubler , qui fera la même chose - ou les deux. Oh, et vous n'avez pas besoin de la variable intermédiaire à moins qu'il utilisé ailleurs. Je suppose que le compilateur optimiserait loin, de toute façon.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Créé 27/02/2009 à 12:45
source utilisateur

voix
55

À mon avis, il est souhaitable d'être aussi explicite que possible. Cela ajoute de la clarté au code et aide vos programmeurs collègues qui peuvent éventuellement lire.

En plus (ou au lieu de) l' ajout d' un .0au numéro, vous pouvez utiliser decimal.ToDouble().

Voici quelques exemples:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Créé 05/08/2008 à 21:18
source utilisateur

voix
53

Cela ressemble à this.Opacityune double valeur, et le compilateur ne vous aime pas essayer de caser une valeur décimale en elle.

Créé 01/08/2008 à 14:53
source utilisateur

voix
45

Vous devez utiliser au 5000.0lieu de 5000.

Créé 20/11/2008 à 15:36
source utilisateur

voix
44

La Opacité propriété est de type double:

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

ou simplement:

this.Opacity = trackBar1.Value / 5000.0;

ou:

this.Opacity = trackBar1.Value / 5000d;

Remarquez que j'utilise 5000.0(ou 5000d) pour forcer une double division parce trackBar1.Valueest un entier et il exécuterait une division entière et le résultat serait un entier.

Créé 31/08/2011 à 20:08
source utilisateur

voix
42

En supposant que vous utilisez WinForms, Form.Opacityest de type double, vous devez donc utiliser:

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

À moins que vous avez besoin de la valeur ailleurs, il est plus simple d'écrire:

this.Opacity = trackBar1.Value / 5000.0;

La raison pour laquelle le contrôle ne fonctionne pas lorsque vous avez changé votre code pour être simplement un double était parce que vous aviez:

double trans = trackbar1.Value / 5000;

qui a interprété la 5000forme d' un entier, de sorte que votre transvaleur est toujours égale à zéro. En faisant explicitement la valeur un numérique à virgule flottante en ajoutant le .0compilateur peut désormais l' interpréter comme un double et d' effectuer un calcul correct.

Créé 31/08/2011 à 20:09
source utilisateur

voix
38

La meilleure solution est:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Créé 06/03/2012 à 09:07
source utilisateur

voix
37

Depuis Opacityune double valeur, je voudrais simplement utiliser un double dès le départ et non jeté du tout, mais assurez - vous d'utiliser un double lors de la division de sorte que vous ne perdez aucune précision

Opacity = trackBar1.Value / 5000.0;
Créé 13/05/2012 à 03:10
source utilisateur

voix
31
this.Opacity = trackBar1.Value / 5000d;
Créé 11/04/2013 à 16:08
source utilisateur

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