Cómo convertir decimal a doblarse en C # -- # campo con floating-point campo con type-conversion campo con double campo con decimal campo con c# campo con floating-point campo con type-conversion campo con double campo con decimal camp Relacionados El problema

How to convert decimal to double in C#


701
vote

problema

Español

Quiero usar un Track-Bar para cambiar una opacidad double1 .

Este es mi código:

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

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

no puede convertir implícitamente Tipo decimal a double

He intentado usar trans y double , pero luego el Control no funciona. Este código funcionó bien en un proyecto VB.NET pasado.

Original en ingles

I want to use a Track-Bar to change a Form's opacity.

This is my code:

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

When I build the application, it gives the following error:

Cannot implicitly convert type decimal to double

I have tried using trans and double, but then the Control doesn't work. This code worked fine in a past VB.NET project.

</div
                             
       
               

Lista de respuestas

466
 
vote
vote
La mejor respuesta
 

Un reparto explícito a double como este no es necesario:

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

Identificación de la constante como 5000.0 (ORS 5000d ) es suficiente:

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

An explicit cast to double like this isn't necessary:

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

Identifying the constant as 5000.0 (or as 5000d) is sufficient:

double trans = trackBar1.Value / 5000.0; double trans = trackBar1.Value / 5000d; 
</div
 
 
128
 
vote

¡Una respuesta más genérica para la pregunta genérica "decimal vs doble?":

decimal es para cálculos monetarios para preservar la precisión. doble es para cálculos científicos que no se ven afectados por pequeñas diferencias. Dado que el doble es un tipo que es nativo de la CPU (la representación interna se almacena en Base 2 ), cálculos realizados con doble rendimiento mejor que decimal (que se representa en base 10 internamente).

 

A more generic answer for the generic question "Decimal vs Double?":

Decimal is for monetary calculations to preserve precision. Double is for scientific calculations that do not get affected by small differences. Since Double is a type that is native to the CPU (internal representation is stored in base 2), calculations made with Double perform better than Decimal (which is represented in base 10 internally).

</div
 
 
86
 
vote

Su código funcionó bien en vb.net porque implícitamente hace algún molde, mientras que C # tiene ambos implícitos y explícitos.

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

en VB La conversión fue agregada por usted por el compilador:

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

que (double) debe indicarse explícitamente en C #, pero puede ser implícito por el compilador más 'perdonador' de VB.

 

Your code worked fine in VB.NET because it implicitly does any casts, while C# has both implicit and explicit ones.

In C# the conversion from decimal to double is explicit as you lose accuracy. For instance 1.1 can't be accurately expressed as a double, but can as a decimal (see "Floating point numbers - more inaccurate than you think" for the reason why).

In VB the conversion was added for you by the compiler:

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

That (double) has to be explicitly stated in C#, but can be implied by VB's more 'forgiving' compiler.

</div
 
 
82
 
vote

¿Por qué estás dividiendo por 5000? Simplemente configure los valores mínimo y máximo de los Trackbar entre 0 y 100 y luego divida el valor por 100 para el porcentaje de opacidad. El mínimo de 20 a continuación evita que el formulario 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; }   
 

Why are you dividing by 5000? Just set the TrackBar's Minimum and Maximum values between 0 and 100 and then divide the Value by 100 for the Opacity percentage. The minimum 20 example below prevents the form from becoming completely 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; } 
</div
 
 
   
       
64
 
vote

Tienes dos problemas.

En primer lugar, Opacity requiere un valor doble, no un valor decimal. El compilador le está diciendo que si bien hay una conversión entre decimal y doble, es una conversión explícita que necesita especificar para que funcione.

En segundo lugar, TrackBar.Value es un valor entero y dividiendo una int por un INT los resultados en un INT no importa en qué tipo de variable lo asignas. En este caso, hay un molde implícito de INT a decimal o doble, porque no hay pérdida de precisión cuando hace el elenco. Así que el compilador no se queja. Pero el valor que obtiene es siempre 0, presumiblemente, ya que double trans = (double) trackBar1.Value / 5000.0; 0 es siempre inferior a 5000.

La solución es cambiar su código para usar el doble (el tipo nativo para la opacidad) y realizar la aritmética del punto flotante al hacer explícitamente la constante un doble, lo que tendrá el efecto de promover la aritmética o la fundición 99887661111 para duplicar, lo que hará lo mismo o ambos. No necesita la variable intermedia a menos que se utilice en otro lugar. Mi conjetura es que el compilador lo optimizaría de todos modos.

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

You have two problems.

Firstly, Opacity requires a double, not a decimal value. The compiler is telling you that while there is a conversion between decimal and double, it is an explicit conversion that you need to specify in order for it to work.

Secondly, TrackBar.Value is an integer value and dividing an int by an int results in an int no matter what type of variable you assign it to. In this case there is an implicit cast from int to decimal or double, because there is no loss of precision when you do the cast. So the compiler doesn't complain. But the value you get is always 0, presumably, since trackBar.Value is always less than 5000.

The solution is to change your code to use double (the native type for Opacity) and do floating point arithmetic by explicitly making the constant a double, which will have the effect of promoting the arithmetic or casting trackBar.Value to double, which will do the same thing or both. You don't need the intermediate variable unless it is used elsewhere. My guess is the compiler would optimize it away anyway.

trackBar.Opacity = (double)trackBar.Value / 5000.0; 
</div
 
 
60
 
vote

En mi opinión, es deseable ser lo más explícito posible. Esto agrega claridad al código y ayuda a sus compañeros programadores que finalmente pueden leerlo.

Además de (o en lugar de) anexar un double trans = (double) trackBar1.Value / 5000.0; 3 al número, puede usar double trans = (double) trackBar1.Value / 5000.0; 4 .

Aquí hay algunos ejemplos:

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

In my opinion, it is desirable to be as explicit as possible. This adds clarity to the code and aids your fellow programmers who may eventually read it.

In addition to (or instead of) appending a .0 to the number, you can use decimal.ToDouble().

Here are some examples:

// Example 1 double transperancy = trackBar1.Value/5000; this.Opacity = decimal.ToDouble(transperancy);  // Example 2 - with inline temp this.Opacity = decimal.ToDouble(trackBar1.Value/5000); 
</div
 
 
59
 
vote

Suena como double trans = (double) trackBar1.Value / 5000.0; 6 es un valor doble, y al compilador no le gusta que intenta meter un valor decimal en él.

 

It sounds like this.Opacity is a double value, and the compiler doesn't like you trying to cram a decimal value into it.

</div
 
 
52
 
vote

el opacidad propiedad es de doble tipo:

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

o simplemente:

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

o:

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

Aviso que estoy usando 5000.00 (o 5000.01 ) para forzar una doble división porque 5000.02 es un número entero y realizaría una división de enteros y el resultado sería un entero.

 

The Opacity property is of double type:

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

or simply:

this.Opacity = trackBar1.Value / 5000.0; 

or:

this.Opacity = trackBar1.Value / 5000d; 

Notice that I am using 5000.0 (or 5000d) to force a double division because trackBar1.Value is an integer and it would perform an integer division and the result would be an integer.

</div
 
 
51
 
vote

Debe usar 5000.0 en lugar de 5000 .

 

You should use 5000.0 instead of 5000.

</div
 
 
49
 
vote

Suponiendo que está usando 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 sencillo escribir:

  this.Opacity = trackBar1.Value / 5000.0;   

La razón por la que el control no funciona cuando cambió su código para simplemente ser un doble fue porque tenía:

  double trans = trackbar1.Value / 5000;   

que interpretó el 5000 como un número entero, y debido a que trackbar1.Value es también un número entero que su valor double trans = trackbar1.Value / 5000; 9 fue siempre cero. Al hacer explícitamente el numérico un valor de punto flotante agregando el 50000 , el compilador ahora puede interpretarlo como un doble y realizar el cálculo adecuado.

 

Assuming you are using WinForms, Form.Opacity is of type double, so you should use:

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

Unless you need the value elsewhere, it's simpler to write:

this.Opacity = trackBar1.Value / 5000.0; 

The reason the control doesn't work when you changed your code to simply be a double was because you had:

double trans = trackbar1.Value / 5000; 

which interpreted the 5000 as an integer, and because trackbar1.Value is also an integer your trans value was always zero. By explicitly making the numeric a floating point value by adding the .0 the compiler can now interpret it as a double and perform the proper calculation.

</div
 
 
43
 
vote

La mejor solución es:

  5000111  
 

The best solution is:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000); 
</div
 
 
43
 
vote

Dado que 50002 es un doble valor, solo usaría un doble desde el principio y no estaría listo en absoluto, pero asegúrese de usar un doble al dividir para que no pierdas ninguna precisión < / p>

  50003 

 

Since Opacity is a double value, I would just use a double from the outset and not cast at all, but be sure to use a double when dividing so you don't loose any precision

Opacity = trackBar1.Value / 5000.0; 
</div
 
 
38
 
vote
  50004  
 
this.Opacity = trackBar1.Value / 5000d; 
</div
 
 
3
 
vote

Pruebe esto:

  50005  
 

Try this:

this.Opacity = decimal.ToDouble(trackBar1.Value / 5000.0); 
</div
 
 
   
       
0
 
vote

Podemos hacer algo así:

  50006  

o simplificado como:

  50007  

También puede usar funciones de conversión incorporadas, como 50008 :

  50009  

También puede usar el formulario simplificado, pero no sugiero usar Form.Opacity0 en ese punto.

 

We can do something like this:

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

Or simplified as:

this.Opacity = trackBar1.Value / 5000.0; 

You can also use built-in converting functions, such as Decimal.ToDouble():

double trans = trackBar1.Value / 5000.0; this.Opacity = Decimal.ToDouble(trans); 

You can also use the simplified form, but I don't suggest using ToDouble() at that point.

</div
 
 
470
 
vote
vote
La mejor respuesta
 

Un reparto explícito a double como esto no es necesario:

  CMSampleBuffer0  

Identificación de la constante como CMSampleBuffer111111 (o como CMSampleBuffer2 ) es suficiente:

  CMSampleBuffer3  
 

An explicit cast to double like this isn't necessary:

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

Identifying the constant as 5000.0 (or as 5000d) is sufficient:

double trans = trackBar1.Value / 5000.0; double trans = trackBar1.Value / 5000d; 
</div
 
 
128
 
vote

¡Una respuesta más genérica para la pregunta genérica "decimal vs doble?":

decimal es para cálculos monetarios para preservar la precisión. doble es para cálculos científicos que no se ven afectados por pequeñas diferencias. Dado que el doble es un tipo que es nativo de la CPU (la representación interna se almacena en Base 2 ), cálculos realizados con doble rendimiento mejor que decimal (que se representa en base 10 internamente).

 

A more generic answer for the generic question "Decimal vs Double?":

Decimal is for monetary calculations to preserve precision. Double is for scientific calculations that do not get affected by small differences. Since Double is a type that is native to the CPU (internal representation is stored in base 2), calculations made with Double perform better than Decimal (which is represented in base 10 internally).

</div
 
 
86
 
vote

Su código funcionó bien en vb.net porque implícitamente hace algún molde, mientras que C # tiene ambos implícitos y explícitos.

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

en VB La conversión fue agregada por usted por el compilador:

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

Ese (double) debe indicarse explícitamente en C #, pero puede ser implícito por el compilador más 'perdonador' de VB.

 

Your code worked fine in VB.NET because it implicitly does any casts, while C# has both implicit and explicit ones.

In C# the conversion from decimal to double is explicit as you lose accuracy. For instance 1.1 can't be accurately expressed as a double, but can as a decimal (see "Floating point numbers - more inaccurate than you think" for the reason why).

In VB the conversion was added for you by the compiler:

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

That (double) has to be explicitly stated in C#, but can be implied by VB's more 'forgiving' compiler.

</div
 
 
82
 
vote

¿Por qué estás dividiendo por 5000? Simplemente configure los valores mínimo y máximo de los Trackbar entre 0 y 100 y luego divida el valor por 100 para el porcentaje de opacidad. El mínimo de 20 a continuación evita que el formulario 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; }   
 

Why are you dividing by 5000? Just set the TrackBar's Minimum and Maximum values between 0 and 100 and then divide the Value by 100 for the Opacity percentage. The minimum 20 example below prevents the form from becoming completely 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; } 
</div
 
 
   
       
64
 
vote

Tienes dos problemas.

En primer lugar, Opacity requiere un valor doble, no un valor decimal. El compilador le está diciendo que si bien hay una conversión entre decimal y doble, es una conversión explícita que necesita especificar para que funcione.

En segundo lugar, TrackBar.Value es un valor entero y dividir un INT por un INT los resultados en un INT sin importar qué tipo de variable lo asignas. En este caso, hay un molde implícito de INT a decimal o doble, porque no hay pérdida de precisión cuando hace el elenco. Así que el compilador no se queja. Pero el valor que obtiene es siempre 0, presumiblemente, ya que trackBar.Value es siempre inferior a 5000.

La solución es cambiar su código para usar el doble (el tipo nativo para la opacidad) y realizar la aritmética del punto flotante al hacer explícitamente la constante un doble, que tendrá el efecto de promover la aritmética o la fundición trackBar.Value para duplicar, lo que hará lo mismo o ambos. No necesita la variable intermedia a menos que se utilice en otro lugar. Mi conjetura es que el compilador lo optimizaría de todos modos.

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

You have two problems.

Firstly, Opacity requires a double, not a decimal value. The compiler is telling you that while there is a conversion between decimal and double, it is an explicit conversion that you need to specify in order for it to work.

Secondly, TrackBar.Value is an integer value and dividing an int by an int results in an int no matter what type of variable you assign it to. In this case there is an implicit cast from int to decimal or double, because there is no loss of precision when you do the cast. So the compiler doesn't complain. But the value you get is always 0, presumably, since trackBar.Value is always less than 5000.

The solution is to change your code to use double (the native type for Opacity) and do floating point arithmetic by explicitly making the constant a double, which will have the effect of promoting the arithmetic or casting trackBar.Value to double, which will do the same thing or both. You don't need the intermediate variable unless it is used elsewhere. My guess is the compiler would optimize it away anyway.

trackBar.Opacity = (double)trackBar.Value / 5000.0; 
</div
 
 
60
 
vote

En mi opinión, es deseable ser lo más explícito posible. Esto agrega claridad al código y ayuda a sus compañeros programadores que finalmente pueden leerlo.

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

Aquí hay algunos ejemplos:

  (double)0  
 

In my opinion, it is desirable to be as explicit as possible. This adds clarity to the code and aids your fellow programmers who may eventually read it.

In addition to (or instead of) appending a .0 to the number, you can use decimal.ToDouble().

Here are some examples:

// Example 1 double transperancy = trackBar1.Value/5000; this.Opacity = decimal.ToDouble(transperancy);  // Example 2 - with inline temp this.Opacity = decimal.ToDouble(trackBar1.Value/5000); 
</div
 
 
59
 
vote

Suena como (double)11111111111 es un valor doble, y al compilador no le gusta que intenta cram un valor decimal en él.

 

It sounds like this.Opacity is a double value, and the compiler doesn't like you trying to cram a decimal value into it.

</div
 
 
52
 
vote

el opacidad propiedad es de doble tipo:

  (double)2  

o simplemente:

  (double)3  

o:

  (double)4  

AVISO DE QUE ESTOYO UTILIZO (double)5 (O (double)6 ) para forzar una doble división porque (double)7 es un número entero y realizaría una división de enteros y el resultado sería un entero.

 

The Opacity property is of double type:

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

or simply:

this.Opacity = trackBar1.Value / 5000.0; 

or:

this.Opacity = trackBar1.Value / 5000d; 

Notice that I am using 5000.0 (or 5000d) to force a double division because trackBar1.Value is an integer and it would perform an integer division and the result would be an integer.

</div
 
 
51
 
vote

Debe usar (double)8 en lugar de (double)9 .

 

You should use 5000.0 instead of 5000.

</div
 
 
49
 
vote

Suponiendo que está usando 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 sencillo escribir:

  this.Opacity = trackBar1.Value / 5000.0;   

La razón por la que el control no funciona cuando cambió su código para simplemente ser un doble fue porque tenía:

  double trans = trackbar1.Value / 5000;   

que interpretó el 5000 como un entero, y debido a que trackbar1.Value6 es un número entero que su valor trackbar1.Value7 fue siempre cero. Al hacer explícitamente el numérico un valor de punto flotante agregando el .0 , el compilador ahora puede interpretarlo como un doble y realizar el cálculo adecuado.

 

Assuming you are using WinForms, Form.Opacity is of type double, so you should use:

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

Unless you need the value elsewhere, it's simpler to write:

this.Opacity = trackBar1.Value / 5000.0; 

The reason the control doesn't work when you changed your code to simply be a double was because you had:

double trans = trackbar1.Value / 5000; 

which interpreted the 5000 as an integer, and because trackbar1.Value is also an integer your trans value was always zero. By explicitly making the numeric a floating point value by adding the .0 the compiler can now interpret it as a double and perform the proper calculation.

</div
 
 
43
 
vote

La mejor solución es:

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

The best solution is:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000); 
</div
 
 
43
 
vote

Dado que double0 es un doble valor, solo usaría un doble desde el principio y no estaría listo en absoluto, pero asegúrate de usar un doble al dividir para que no pierdas ninguna precisión < / p>

  double111 

 

Since Opacity is a double value, I would just use a double from the outset and not cast at all, but be sure to use a double when dividing so you don't loose any precision

Opacity = trackBar1.Value / 5000.0; 
</div
 
 
38
 
vote
  double2  
 
this.Opacity = trackBar1.Value / 5000d; 
</div
 
 
4
 
vote

Intenta usar la función de fundición:

  double3  
 

Try this:

this.Opacity = decimal.ToDouble(trackBar1.Value / 5000.0); 
</div
 
 
   
       

Relacionados problema

701  Cómo convertir decimal a doblarse en C #  ( How to convert decimal to double in c sharp ) 
Quiero usar un Track-Bar para cambiar una opacidad double1 . Este es mi código: decimal trans = trackBar1.Value / 5000; this.Opacity = trans; Cuan...

0  ¿Convertir cadena de inicio con 0 a 2 decimal lugar asp.net?  ( Convert string start with 0 to 2 decimal place asp net ) 
Tengo esta cadena: Dim value as String = "0.11209176170341301" e intenté usar este código para convertir la cadena en decimal con dos lugares: Dim v...

2  Entrada Xamarin.Forms con automóviles miles y separadores decimales  ( Xamarin forms entry with auto thousand and decimal separator ) 
Tengo una entrada de Xamarin.Forms con teclado numérico que representará una moneda real de PT -R (999.999,99). Cuando escribo los números en el teclado numér...

12  Implementaciones de protocolo duplicado en proyectos dependientes  ( Duplicate protocol implementations in dependent projects ) 
Tengo problemas con la consolidación de la implementación del protocolo en mi proyecto Elixir. Para ser más específico, utilizo Ecto y algún proyecto simple...

2  Python decimal desesperadamente simple  ( Desperately simple python decimal ) 
Hola, necesito ayuda por favor. Quiero calcular los números de flotador con un formato como xxxxx.yyyyyyyyyyyyyyy. He aprendido que debería usar decimal en lu...

3  Configuración de bits específicos en un número  ( Setting specific bits in a number ) 
var d = 7; en binario: 7 = (111) Lo que quiero hacer es configurar el segundo lugar de derecha a 1 o 0 a disposición, y devolver el valor decimal. Por...

13  Decimal aleatorio en Python  ( Random decimal in python ) 
¿Cómo obtengo un aleatorio decimal.Decimal instancia? Parece que el módulo aleatorio solo devuelve los flotadores que son un pita para convertir a decimal...

1  Multiplicar, restar y dividir números binarios dan respuestas incorrectas  ( Multiplying subtracting and dividing binary numbers give wrong answers ) 
Estoy haciendo una aplicación de calculadora binaria. No hay problemas de construcción, pero en la aplicación, solo agregar números binarios, dan la respuesta...

-1  Puntos decimales de Java  ( Java decimal points ) 
Mi pregunta es: ¿Cómo hago que el programa imprima el número de dígitos antes del punto decimal y cuántos vienen después de un número? public class Strin...

1  Entrada regional del separador decimal [cerrado]  ( Regional decimal seperator input ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos