Pregunta ¿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.


568
2017-07-31 22:17


origen


Respuestas:


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

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

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

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

401
2017-08-01 14:23



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


117
2017-08-10 17:54



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 (ver "Números flotantes de puntos: más inexactos de lo que crees"por la razón de por qué).

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

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

Ese (double) tiene que declararse explícitamente en C #, pero puede ser implícito por el compilador más "tolerante" de VB.


76
2017-09-21 03:51



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

74
2018-02-27 11:45



Tienes dos problemas. Primero, Opacity requiere 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.Value es 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 que trackBar.Value siempre es menor que 5000. La solución es cambiar el código para usar double (el tipo nativo para Opacity) y hacer aritmética de punto flotante al hacer explícitamente la constante un doble, lo que tendrá el efecto de promover la aritmética, o fundición. trackBar.Value doblar, 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;

57
2017-08-05 20:18



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 .0 al número, puedes 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);

55
2017-08-01 13:53



Suena como this.Opacity es un valor doble, y al compilador no le gusta que trates de introducir un valor decimal en él.


54
2017-11-20 14:36



Deberías usar 5000.0 en lugar de 5000.


45
2017-08-31 19:08