¿Convertir decimal a doble?

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:

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

Intenté usar trans y double pero luego el control no funciona. Este código funcionó bien en un proyecto anterior de VB.NET.

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; 

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).

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 express 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 comstackdor agregó la conversión:

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

Eso (double) tiene que estar explícitamente establecido en C #, pero puede estar implícito en el comstackdor más “tolerante” de VB.

¿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; } 

Tienes dos problemas. Primero, la Opacity requiere un valor doble, no decimal. El comstackdor 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.Value es un valor entero y dividir un int por un int resulta en 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 comstackdor no se queja, pero el valor que obtienes es siempre 0, presumiblemente, desde trackBar.Value siempre 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 casting trackBar.Value para duplicar, 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 comstackdor lo optimizaría de todos modos.

 trackBar.Opacity = (double)trackBar.Value / 5000.0; 

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 progtwigdores que eventualmente lo puedan leer.

Además de (o en lugar de) agregar un .0 al nú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); 

Suena así. La this.Opacity es un valor doble, y al comstackdor no le gusta que this.Opacity un valor decimal en él.

Deberías usar 5000.0 vez de 5000 .

La propiedad Opacity 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; 

Observe que estoy usando 5000.0 (o 5000d ) para forzar una división doble porque trackBar1.Value es un número entero y realizaría una división entera y el resultado sería un número entero.

Suponiendo que está utilizando WinForms, Form.Opacity es de tipo double , por lo que debe usar:

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

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

 this.Opacity = trackBar1.Value / 5000.0; 

La razón por la que el control no funciona cuando cambiaste tu código para simplemente ser un doble era porque tenías:

 double trans = trackbar1.Value / 5000; 

que interpretó el 5000 como un número entero, por lo que su valor trans siempre fue cero. Al convertir explícitamente el valor numérico en coma flotante agregando el .0 el comstackdor ahora puede interpretarlo como un doble y realizar el cálculo adecuado.

La mejor solución es:

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

Como Opacity tiene un doble valor, usaría un doble desde el principio y no lanzaría nada, pero asegúrese de usar un doble al dividir para no perder precisión

 Opacity = trackBar1.Value / 5000.0; 
 this.Opacity = trackBar1.Value / 5000d;