c# - Convertir décimal en double

Translate

Je souhaite utiliser une barre de suivi pour modifier l'opacité d'un formulaire.

Voici mon code:

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

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

Impossible de convertir implicitement le typedecimalàdouble

J'ai essayé d'utilisertransetdoublemais alors le contrôle ne fonctionne pas. Ce code a bien fonctionné dans un ancien projet VB.NET.

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

Toutes les réponses

Translate

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

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

Identifier la constante comme5000.0(ou comme5000d) est suffisant:

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

Une réponse plus générique à la question générique "Décimal vs Double?":Décimalpour les calculs monétaires pour préserver la précision,Doublepour des calculs scientifiques qui ne sont pas affectés par de petites différences. Puisque Double est un type natif du CPU (la représentation interne est stockée dansbase 2), les calculs effectués avec Double fonctionnent mieux que Decimal (qui est représenté dansbase 10intérieurement).

La source
Translate

Votre code a bien fonctionné dans VB.NET car il effectue implicitement tous les casts, tandis que C # en a à la fois implicites et explicites.

En C #, la conversion de décimal en double est explicite car vous perdez en précision. Par exemple, 1.1 ne peut pas être exprimé avec précision sous forme de double, mais peut être exprimé en décimal (voir "Nombres à virgule flottante - plus inexacts que vous ne le pensez"pour la raison pour laquelle).

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

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

Cette(double)doit être explicitement indiqué en C #, mais peut êtreimplicitepar le compilateur plus «indulgent» de VB.

La source
Translate

Pourquoi divisez-vous par 5000? Définissez simplement les valeurs minimum et maximum de la TrackBar entre 0 et 100, puis divisez la valeur par 100 pour le pourcentage d'opacité. L'exemple minimum 20 ci-dessous empêche le formulaire 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;
}
La source
Translate

Vous avez deux problèmes. Première,Opacitynécessite un double, pas une valeur décimale. Le compilateur vous dit que bien qu'il y ait une conversion entre décimal et double, c'est une conversion explicite que vous devez spécifier pour que cela fonctionne. La seconde est queTrackBar.Valueest une valeur entière et la division d'un int par un int donne un int quel que soit le type de variable auquel vous l'assignez. Dans ce cas, il y a un cast implicite de int en décimal ou double - car il n'y a pas de perte de précision lorsque vous faites le cast - donc le compilateur ne se plaint pas, mais la valeur que vous obtenez est toujours 0, vraisemblablement, puisquetrackBar.Valueest toujours inférieur à 5000. La solution est de changer votre code pour utiliser double (le type natif pour Opacity) et faire de l'arithmétique en virgule flottante en faisant explicitement de la constante un double - ce qui aura pour effet de promouvoir l'arithmétique - ou de lancertrackBar.Valuedoubler, ce qui fera la même chose - ou les deux. Oh, et vous n'avez pas besoin de la variable intermédiaire à moins qu'elle ne soit utilisée ailleurs. Je suppose que le compilateur l'optimiserait de toute façon.

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

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

En plus (ou au lieu de) ajouter un.0au numéro, vous pouvez utiliserdecimal.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);
La source
Translate

Cela ressemblethis.Opacityest une valeur double, et le compilateur n'aime pas que vous essayiez d'y insérer une valeur décimale.

La source
Translate

Tu devrais utiliser5000.0au lieu de5000.

La source
Translate

leOpacitéla 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;

Notez que j'utilise5000.0(ou5000d) pour forcer une double division cartrackBar1.Valueest un entier et il effectuerait une division entière et le résultat serait un entier.

La source
Translate

En supposant que vous utilisez WinForms,Form.Opacityest de typedouble, vous devriez donc utiliser:

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

Sauf si 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 que vous aviez:

double trans = trackbar1.Value / 5000;

qui a interprété le5000comme un entier, et parce quetrackbar1.Valueest également un entier votretransla valeur était toujours zéro. En faisant explicitement du numérique une valeur à virgule flottante en ajoutant le.0le compilateur peut maintenant l'interpréter comme un double et effectuer le calcul approprié.

La source
Translate

La meilleure solution est:

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

DepuisOpacityest une valeur double, je voudrais simplement utiliser un double dès le départ et ne pas lancer du tout, mais assurez-vous d'utiliser un double lors de la division afin de ne perdre aucune précision

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