385 votos

Al ajustar la opacidad de un formulario debo usar un decimal o el doble?

Quiero utilizar una pista-barra para cambiar la opacidad de un formulario.

Este es mi código:

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

Cuando intento compilar, me sale este error:

No se puede convertir implícitamente el tipo 'decimal' a 'doble'.

Traté de hacer trans duplicar, pero entonces el control no funciona. Este código ha trabajado muy bien para mí en VB.NET en el pasado.

287voto

Kevin Dente Puntos 7732

Una conversión explícita al doble no es necesario.

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

La identificación de la constante como 5000.0 (o como 5000d ) es suficiente:

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

75voto

huseyint Puntos 8196

Una respuesta más genérica para la pregunta genérica "Decimal vs doble?": Decimal para cálculos monetarios para preservar la precisión, dobles para los cálculos científicos que no se vea afectado por las pequeñas diferencias. Desde doble es un tipo que es nativo de la CPU (representación interna se almacena en la base 2), los cálculos realizados con doble desempeñan mejor entonces decimal (que se representa en base 10 internamente).

48voto

Keith Puntos 46288

El código funcionó bien en VB.NET porque, implícitamente, ¿alguno de los modelos, mientras que C# tiene implícita y explícita.

En C# la conversión de decimal a doble es explícita en cuanto a perder precisión. Por ejemplo, 1.1 no puede ser exactamente expresado como un doble, pero puede como un decimal (consulte "números de punto Flotante - más impreciso de lo que usted piensa" por la razón de por qué).

En VB la conversión fue añadido por el compilador:

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

Que (double) tiene que ser de forma explícita en C#, pero puede ser implícita por VB más " indulgente " compilador.

46voto

Gordon Bell Puntos 5798

¿Por qué estás dividiendo por 5000? Sólo tienes que configurar mínima del TrackBar y valores máximos de entre 0 y 100 y luego dividir el valor por 100 para el porcentaje de opacidad. Mínimo 20 siguiente ejemplo evita que la forma de convertirse en completamente 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;
}
 

35voto

andnil Puntos 8179

En mi opinión, es deseable que sea lo más explícito posible. Esto añade claridad al código y ayuda a tus compañeros programadores que eventualmente puede leerlo.

Además de (o en lugar de) añadiendo un .0 en el número, puede utilizar decimal.ToDouble() .

He aquí algunos ejemplos:

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

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X