¿Cómo se lanza un doublea decimalque se usa cuando se hace el desarrollo de la moneda? ¿A dónde Mva?
decimal dtot = (decimal)(doubleTotal);
Solo usa Mpara un literal numérico, cuando lanza es solo:
decimal dtot = (decimal)doubleTotal;
Tenga en cuenta que un número de punto flotante no es adecuado para mantener un valor exacto, por lo que si primero suma números y luego convierte a Decimal, puede obtener errores de redondeo. Es posible que desee convertir los números Decimalantes de sumarlos, o asegurarse de que los números no sean números de punto flotante en primer lugar.
Puede convertir un doble a un decimal como este, sin necesidad del Msufijo literal:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Debe usar el Mal declarar un nuevo valor decimal literal:
decimal dec = 123.45M;
(Sin el M, 123.45 se trata como un doble y no se compilará).
use la clase de conversión predeterminada: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
doublea decimal, dado que para un doublevalor como (1000000.0 / 3.0) uno lo haría en algunos casos desea recortar el "exceso" de precisión dando 333333.333333333D, pero en otros casos uno querría retenerlo, dando 333333.333333333313931D. En lugar de simplemente decir "convertir a decimal", el código debe especificar cómo se debe realizar esa conversión.
Convert.ToDecimal(double)es el mismo que (decimal)doubleTotal, excepto que si se doubleTotalcambia a un tipo diferente, probablemente evitaría un error en tiempo de compilación e introduciría un error en tiempo de ejecución más difícil de encontrar debido a un ToDecimal diferente se podría llamar a override. El operador de reparto es mucho más explícito ...
Bueno, esta es una pregunta antigua y de hecho hice uso de algunas de las respuestas que se muestran aquí. Sin embargo, en mi escenario particular, era posible que el doublevalor al que quería convertir a decimalmenudo fuera mayor que decimal.MaxValue. Entonces, en lugar de manejar excepciones, escribí este método de extensión:
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
El enfoque anterior funciona si no quiere molestarse en manejar las excepciones de desbordamiento y si tal cosa sucede, solo desea mantener el valor máximo posible (mi caso), pero soy consciente de que para muchos otros escenarios este no sería el comportamiento esperado y puede ser la excepción será necesaria la manipulación.