Al aplicar la opacidad a un formulario, ¿debemos usar un valor decimal o doble?

votos
557

Quiero usar una barra de seguimiento para cambiar la opacidad de un formulario.

Este es mi código:

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

Cuando construyo la aplicación, da el siguiente error:

Imposible convertir implícitamente tipo 'decimal'a 'double'.

Intenté usar transy doublepero el control no funciona. Este código funcionó bien en un proyecto anterior de VB.NET.

Publicado el 31/07/2008 a las 22:42
fuente por usuario
En otros idiomas...                            


13 respuestas

votos
395

No es necesario un lanzamiento explícito para doblar así:

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

Identificar la constante como 5000.0(o como 5000d) es suficiente:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Respondida el 31/07/2008 a las 23:17
fuente por usuario

votos
114

Una respuesta más genérica para la pregunta genérica "Decimal contra doble?": Decimal para cálculos monetarios para conservar la precisión, doble para cálculos científicos que no se vean afectados por pequeñas diferencias. Como Double es un tipo que es nativo de la CPU (la representación interna se almacena en la base 2 ), los cálculos realizados con Double funcionan mejor que Decimal (que se representa en la base 10 internamente).

Respondida el 01/08/2008 a las 15:23
fuente por usuario

votos
75

Su código funcionó bien en VB.NET porque implícitamente hace conversiones, mientras que C # tiene tanto implícitos como explícitos.

En C #, la conversión de decimal a doble es explícita a medida que pierde precisión. Por ejemplo, 1.1 no se puede expresar con precisión como un doble, pero puede hacerlo como un decimal (consulte " Números de puntos flotantes: más inexactos de lo que cree " por la razón).

En VB, el compilador agregó la conversión:

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

Eso (double)debe indicarse explícitamente en C #, pero puede estar implícito en el compilador más "tolerante" de VB.

Respondida el 10/08/2008 a las 18:54
fuente por usuario

votos
74

¿Por qué estás dividiendo por 5000? Simplemente configure los valores Mínimo y Máximo del TrackBar entre 0 y 100 y luego divida el Valor por 100 para el porcentaje de Opacidad. El ejemplo mínimo de 20 a continuación evita que la forma se vuelva 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;
}
Respondida el 21/09/2008 a las 04:51
fuente por usuario

votos
57

Tienes dos problemas. Primero, Opacityrequiere un valor doble, no decimal. El compilador le dice que si bien hay una conversión entre decimal y doble, es una conversión explícita que debe especificar para que funcione. El segundo es que TrackBar.Valuees un valor entero y dividir un int por un int arroja un int sin importar a qué tipo de variable lo asigne. En este caso hay una conversión implícita de int a decimal o double, porque no hay pérdida de precisión cuando haces el reparto, por lo que el compilador no se queja, pero el valor que obtienes es siempre 0, presumiblemente, ya quetrackBar.Valuesiempre es menor a 5000. La solución es cambiar el código para usar double (el tipo nativo para Opacity) y hacer aritmética de coma flotante haciendo explícitamente a la constante un doble, que tendrá el efecto de promover la aritmética, o lanzar trackBar.Valueal doble , que hará lo mismo, o ambos. Ah, y no necesitas la variable intermedia a menos que se use en otro lado. Mi suposición es que el compilador lo optimizaría de todos modos.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Respondida el 27/02/2009 a las 12:45
fuente por usuario

votos
55

En mi opinión, es deseable ser lo más explícito posible. Esto agrega claridad al código y ayuda a los demás programadores que eventualmente lo puedan leer.

Además de (o en lugar de) agregar un .0número, puede usar decimal.ToDouble().

Aquí hay unos 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);
Respondida el 05/08/2008 a las 21:18
fuente por usuario

votos
53

Parece que this.Opacitytiene un doble valor, y al compilador no le gusta que trates de introducir un valor decimal en él.

Respondida el 01/08/2008 a las 14:53
fuente por usuario

votos
45

Deberías usar en 5000.0lugar de 5000.

Respondida el 20/11/2008 a las 15:36
fuente por usuario

votos
44

La opacidad propiedad es de tipo doble:

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

o simplemente:

this.Opacity = trackBar1.Value / 5000.0;

o:

this.Opacity = trackBar1.Value / 5000d;

Noto que estoy usando 5000.0(o 5000d) para forzar una doble división, porque trackBar1.Valuees un entero y se llevaría a cabo una división entera y el resultado sería un entero.

Respondida el 31/08/2011 a las 20:08
fuente por usuario

votos
42

Suponiendo que está usando Windows Forms, Form.Opacityes de tipo double, por lo que debe utilizar:

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

A menos que necesite el valor en otro lugar, es más fácil de escribir:

this.Opacity = trackBar1.Value / 5000.0;

La razón por la que el control no funciona cuando se ha cambiado el código a ser simplemente un doble era porque tenía:

double trans = trackbar1.Value / 5000;

que interpretaron el 5000como un entero, por lo que su transvalor fue siempre cero. Al hacer explícitamente el valor de punto flotante numérica mediante la adición del .0compilador ahora puede interpretarlo como un doble y realizar el cálculo correcto.

Respondida el 31/08/2011 a las 20:09
fuente por usuario

votos
38

La mejor solución es:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Respondida el 06/03/2012 a las 09:07
fuente por usuario

votos
37

Dado que Opacityes un valor doble, yo sólo uso una doble desde el principio y no echo en absoluto, pero asegúrese de usar un doble al dividir por lo que no pierde precisión

Opacity = trackBar1.Value / 5000.0;
Respondida el 13/05/2012 a las 03:10
fuente por usuario

votos
31
this.Opacity = trackBar1.Value / 5000d;
Respondida el 11/04/2013 a las 16:08
fuente por usuario

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